EventArgs VS GridViewRowEventArgs

时间:2015-10-03 18:28:12

标签: c# asp.net gridview

我正在尝试从我的asp.net gridview访问按钮单击事件。如果我保留我的语法

protected void Remove(Object sender, GridViewRowEventArgs e)
{
}

它们没有编译错误,但是我收到了调试错误。的

  

''匹配委托'System.EventHandler'

没有重载

好吧,如果我将语法改为

protected void Remove(Object sender, EventArgs e)
{
  var command = ((Button)sender).CommandArgument;            
  if (command.CommandName == "Remove")
  {
    DataGridItem gr = (DataGridItem)command.NamingContainer;
    string abcd = gr.Cells[0].Text;
  }
}

我得到多个编译错误:

  

'string'不包含'CommandName'的定义,也没有扩展方法'CommandName'接受'string'类型的第一个参数   可以找到(你错过了使用指令或程序集引用吗?)

     

'string'不包含'NamingContainer'的定义,也没有扩展方法'NamingContainer'接受'string'类型的第一个参数   可以找到(你错过了使用指令或程序集引用吗?)

我想要做的是从网格视图中的按钮按下事件访问该值并运行存储过程。

这是aspx标记

<asp:GridView ID="gvwEditDashboard" runat="server"  AutoGenerateColumns="False" ShowFooter="true" CssClass="DataGrids"
Width="500px" HorizontalAlign="Center" GridLines="Both" >
<Columns> 
<ItemTemplate>
  <asp:LinkButton ID = "btnDelete" runat = "server" CssClass="ButtonLink"  Text = "[Delete]" OnClick = "Remove" />
</ItemTemplate>
</Columns>
</asp:GridView>

2 个答案:

答案 0 :(得分:2)

首先,要了解GridViewRowEventArgs适用于事件:RowCreatedRowDataBound。这些事件不是按钮点击事件。

其次,当点击LinkBut​​ton时,可能会引发两个事件:LinkButton.ClickGridView.RowCommand

我的建议是使用/处理GridView的RowCommand事件。

有许多技术可以获取在此事件中单击按钮的Row数据。

特别针对您的情况,将LinkBut​​ton声明为:

<ItemTemplate>
  <asp:LinkButton ID = "btnDelete" runat = "server"
       CssClass="ButtonLink"  Text = "[Delete]" OnClick = "Remove" 
       CommandArgument="<%# Container.DataItemIndex %>" />
</ItemTemplate>

注意LinkBut​​ton的CommandArgument属性。

和RowCommand事件。请注意,第二个参数是GridViewCommandEventArgs

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
        // The RowIndex of the Row where LinkButton was clicked
        int rowIndex = Convert.ToInt32(e.CommandArgument);

        // Get the GridView Row
        GridViewRow row = GridView1.Rows[rowIndex];

        // Read the Column values
        // e.g. for BoundFields use row.Cells[] 
        string Column_1_Value = row.Cells[0].Text;

        // for Columns defined using <itemTemplate> etc...
        // row.FindControl("<Control_ID>")
        string firstName = (row.FindControl("txtFirstName") as TextBox).Text;
}

LinkBut​​ton的替代方案,您也可以使用ButtonFields。检查此链接上的行命令事件。 MSDN示例很好地解释了读取行数据。

答案 1 :(得分:0)

protected void Remove(Object sender, EventArgs e)
{
   var command = ((Button)sender).CommandArgument;            
   if (command.CommandName == "Remove")
   {
     DataGridItem gr = (DataGridItem)command.NamingContainer;
     string abcd = gr.Cells[0].Text;
   }
 }

变种的危害CommandArgument是按钮上的字符串类型。您收到该错误,因为字符串没有CommandName或NamingContainer属性。

尝试以下方法:

protected void Remove(Object sender, CommandEventArgs e)
{         
   if (e.CommandName == "Remove")
   {
     DataGridItem gr = e.NamingContainer;
     string abcd = gr.Cells[0].Text;
   }
 }