Asp.net 如何以编程方式在DetailsView中创建一个按钮并给它一个CommandName?

Asp.net 如何以编程方式在DetailsView中创建一个按钮并给它一个CommandName?,asp.net,detailsview,Asp.net,Detailsview,在DetailsView中,我以编程方式创建了一个delete按钮,并给它一个CommandName。当我测试我的应用程序时,按钮被创建得很好,但是当我单击删除按钮时,什么也没有发生。如果我在DetailsView中定期使用相同的CommandName创建这个完全相同的按钮,那么它可以完美地工作并正确地激发DetailsView的ItemCommand。这意味着我在代码中创建按钮的方式有问题,但我不知道它是什么。我需要指定一个唯一的ID或类似的东西吗 以下是我以编程方式创建“删除”按钮的代码,该

在DetailsView中,我以编程方式创建了一个delete按钮,并给它一个CommandName。当我测试我的应用程序时,按钮被创建得很好,但是当我单击删除按钮时,什么也没有发生。如果我在DetailsView中定期使用相同的CommandName创建这个完全相同的按钮,那么它可以完美地工作并正确地激发DetailsView的ItemCommand。这意味着我在代码中创建按钮的方式有问题,但我不知道它是什么。我需要指定一个唯一的ID或类似的东西吗

以下是我以编程方式创建“删除”按钮的代码,该按钮不起作用:

Public Sub GetAttachments(ByVal requestID As Integer)
    Try
        Dim pnlAttachments As Panel = dtlApplication.FindControl("pnlAttachments")
        Dim btnDelete As New LinkButton
        btnDelete.Text = "delete"
        btnDelete.CssClass = "lblDeleteAttachment"
        btnDelete.CommandName = "DeleteAttachment"
        btnDelete.ID = "lnkDeleteAttachment"
        pnlAttachments.Controls.Add(btnDelete)
    Catch ex As Exception
        'notify user on screen
        lblGeneralError.Text = ex.ToString
        lblGeneralError.CssClass = "red"
    End Try
End Sub  
<a id="MainContent_dtlApplication_lnkDeleteAttachment" href="javascript:__doPostBack('ctl00$MainContent$dtlApplication$lnkDeleteAttachment','')">delete</a>
如果我像这样定期创建按钮,效果会很好:

<asp:LinkButton runat="server" ID="lnkDeleteAttachment" Text="delete" commandname="DeleteAttachment" CssClass="lblDeleteAttachment"></asp:LinkButton>

以下是定期创建的按钮的渲染页面输出:

<a id="MainContent_dtlApplication_lnkDeleteAttachment" href="javascript:__doPostBack('ctl00$MainContent$dtlApplication$lnkDeleteAttachment','')">delete</a>

你可以看到它们是一样的


注意:我之所以以编程方式创建它,是因为最终我将在FORNEXT语句中添加几个delete按钮,此时,我将无法选择是否定期或以编程方式创建它。

在标记中创建按钮,然后以编程方式隐藏或显示它可能会更容易。

如果希望触发每次回发,则需要在每次回发中添加onclick事件处理程序。我的建议是,让它在标记中声明,并将
visible
属性设置为false,并在需要时使其可见。您不必处理此类问题,除非在某个点设置为可见,否则无论如何都不会呈现控件。

请参考代码。我可以在button1\u命令中捕捉到button命令。但是,您需要附加事件处理程序-button1.Command+=button1\u命令

<asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px" OnItemCommand="DetailsView1_ItemCommand"
    OnDataBound="DetailsView1_DataBound" AllowPaging="true">
    <Fields>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Panel ID="Panel1" runat="server">
                </asp:Panel>
            </ItemTemplate>
        </asp:TemplateField>
    </Fields>
</asp:DetailsView>

public class Customer
{
    public int CustomerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

private List<Customer> _customers;

public List<Customer> Customers
{
    get
    {
        if (_customers == null)
        {
            _customers = new List<Customer>();

            _customers.Add(new Customer {CustomerId = 1, FirstName = "Jon", LastName = "Doe"});
            _customers.Add(new Customer {CustomerId = 2, FirstName = "Mary", LastName = "Doe"});
            _customers.Add(new Customer {CustomerId = 3, FirstName = "Brian", LastName = "Newton"});
        }
        return _customers;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    DetailsView1.DataSource = Customers;
    DetailsView1.DataBind();
}

protected void DetailsView1_DataBound(object sender, EventArgs e)
{
    Panel panel1 = DetailsView1.FindControl("Panel1") as Panel;
    Button button1 = new Button();
    button1.Text = "Delete";
    button1.Command += button1_Command;
    button1.CommandName = "Delete";
    panel1.Controls.Add(button1);
}

void button1_Command(object sender, CommandEventArgs e)
{
    // Delete data here
}

公共类客户
{
public int CustomerId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
私人客户名单;
公开名单客户
{
得到
{
如果(_customers==null)
{
_客户=新列表();
_添加(新客户{CustomerId=1,FirstName=“Jon”,LastName=“Doe”});
_添加(新客户{CustomerId=2,FirstName=“Mary”,LastName=“Doe”});
_添加(新客户{CustomerId=3,FirstName=“Brian”,LastName=“Newton”});
}
退回客户;
}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
DetailsView1.DataSource=客户;
DetailsView1.DataBind();
}
受保护的void DetailsView1_数据绑定(对象发送方,事件参数e)
{
Panel panel1=作为面板的详细视图1.FindControl(“panel1”);
Button button1=新按钮();
按钮1.Text=“删除”;
按钮1.命令+=按钮1\u命令;
button1.CommandName=“删除”;
面板1.控件。添加(按钮1);
}
void button1_命令(对象发送方,CommandEventArgs e)
{
//在此处删除数据
}

在您的代码中,您没有提供ID,请尝试添加一行,如下所示:btnDelete.ID=“lnkDeleteAttachment”谢谢,但添加ID并没有解决问题。我之所以以编程方式创建ID,是因为最终我将在For Next语句中添加几个删除按钮,在这一点上,我将无法选择是否定期或以编程方式创建它。我已经更新了这个问题。我之所以以编程方式创建它,是因为最终我将在For Next语句中添加几个delete按钮,此时我将无法选择是否定期或以编程方式创建它。我已经更新了这个问题。@brianmcculloh很好,然后确保在每次回发时都添加OnClick事件处理程序,并按照Davide Piras在评论中的建议为其分配ID。谢谢。我添加了ID,但我不太清楚“添加onclick偶数处理程序”是什么意思。在哪里/如何添加此内容?我尝试了btnDelete.OnClick,但它在intellisense中甚至不存在。非常感谢您的帮助。很有趣,但是我无法访问按钮的.CommandName或.CommandArgument命令。换句话说,这一行不起作用:button1.Command+=button1\u Command;不管怎样,我意识到这是因为我需要使用VB的AddHandler而不是C#方法。谢谢