如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?

Posted

技术标签:

【中文标题】如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?【英文标题】:How do I programmatically add a button to a gridview and assign it to a specific code-behind function? 【发布时间】:2011-01-25 23:29:01 【问题描述】:

在运行时,我正在创建一个 DataTable 并使用嵌套的 for 循环来填充表。我稍后将此表作为 DataSource 分配给 gridview 并在 RowDataBound 上分配每个单元格的值。我想知道如何给每个单元格一个按钮并将该按钮分配给代码隐藏函数。我将有 12 个按钮,每个按钮都包含不同的值。如果它们都使用某种存储单元特定值的事件调用相同的函数,我会更喜欢。

这是创建表格的代码:

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e)



    DataTable diceTable = _gm.GetDice(_gameId);
    for (int i = 0; i < GameRules.ColumnsOfDice; i++)
    
        if(e.Row.RowIndex > -1)
        
            /*This is where I'd like to add the button*/
            //e.Row.Cells[i].Controls.Add(new Button);
            //e.Row.Cells[i].Controls[0].Text = specific value from below

            //This is where the specific value gets input
            e.Row.Cells[i].Text = diceTable.Rows[e.Row.RowIndex][i].ToString();
        

    

我想用这样的方式处理按钮点击:

protected void DiceButton_Click(int column, int row, int value)

    //Do whatever

有什么建议吗?

【问题讨论】:

【参考方案1】:

在标记中的 gridview 上,将 CommandArgument 属性分配给按钮内您想要的任何一个(这里我选择当前 gridviewrow 的索引)。

 <asp:Button ID="lbnView" runat="server" Text="Button" OnClick="btn_Clicked" 
CommandArgument="<%# ((GridViewRow)Container).RowIndex %>"></asp:Button>

或者在您的代码后面,您可以创建一个如下所示的按钮

protected void GridViewDice_RowDataBound(object sender, GridViewRowEventArgs e) 
 


    DataTable diceTable = _gm.GetDice(_gameId); 
    for (int i = 0; i < GameRules.ColumnsOfDice; i++) 
     
        if(e.Row.RowIndex > -1) 
         
            Button btn = new Button();
            btn.CommandArgument = diceTable.Rows[e.Row.RowIndex][i].ToString(); 
            btn.Attributes.Add("OnClick", "btn_Clicked");

            e.Row.Cells[i].Controls.Add(btn);
        
    

然后制作一个如下所示的事件处理程序

protected void btn_Clicked(object sender, EventAgrs e)

   //get your command argument from the button here
   if (sender is Button)
   
     try
     
        String yourAssignedValue = ((Button)sender).CommandArgument;
     
     catch
     
       //Check for exception
     
   

【讨论】:

谢谢,我马上试试。但是,根据 Mike Mooney 的另一篇文章,这难道不是行不通的吗? 按钮出现了,但事件似乎没有被触发..这是因为下面提到的原因吗? 而不是 btn.Attributes.Add("OnClick", "btn_Clicked");尝试 btn.Click += new EventHandler(btn_Clicked);【参考方案2】:

不幸的是,在那个阶段您无法创建新按钮并为其分配事件。在页面生命周期的这一点上,当它触发事件时,它已经建立了它的“已知”控件列表,它将跟踪页面何时重新加载,因此它不会知道触发你的按钮单击事件代码下次回帖时。

为了让 ASP.NET 正确触发您的事件方法,您需要在页面的 Load 事件之前将 Button 控件添加到页面的控件层次结构中。我通常在 Init 事件或 CreateChildControls 方法中进行。

为了解决您的问题,我建议将按钮添加到模板标记中的所有单元格,并让它引用那里的事件处理程序。然后,让您的 RowDataBound 方法句柄打开或关闭按钮的可见性。

【讨论】:

所以基本上在 Page_Init 我创建了一个我用按钮填充的 DataTable 模板?我不确定我是否在关注。感谢您的回答!【参考方案3】:

最简单的方法是在 GridView 中添加一列(如果您愿意,可以使用按钮而不是超链接):

<Columns>
 <asp:HyperLinkField DataNavigateUrlFields="ID" DataNavigateUrlFormatString="~/pUser.aspx?field=0" HeaderText="Select" Text="Select" />

【讨论】:

以上是关于如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建实体并将其添加到数组控制器

如何使用 CEF WinForms 以编程方式将文件附件添加到网页

使用 ConstraintSet 以编程方式将 Button 添加到 ConstrainLayout

尝试以编程方式使用嵌套的 Stack 视图制作网格

如何在 Swift 4 中以编程方式将 IBAction 添加到按钮?

按钮按下以编程方式将新行添加到 ListView,如何?