如何在网格视图的RowCommand方法中找到标签控件?

Kri*_*ppa 2 c# asp.net gridview

GridViewRow clickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;
Label lblUser = clickedRow.FindControl("lblFullName") as Label;
Label lblUserId = (Label)clickedRow.FindControl("lblUserId");
Run Code Online (Sandbox Code Playgroud)

编译器抛出错误为

无法转换类型为“System.Web.UI.WebControls.GridView”的对象

Rah*_*ngh 5

您当前代码的问题是 GridView 的RowCommand事件是由 gridview 本身引发的,而不是由单个控件引发的,因此您的转换将失败:-

(LinkButton)sender
Run Code Online (Sandbox Code Playgroud)

因为这里的发送者是Gridview而不是链接按钮。

现在,您的 gridview 中可能有多个可以引发此事件的控件(或者您将来可能添加它们),因此CommandName向您的 LinkBut​​ton 添加一个属性,如下所示:-

<asp:LinkButton ID="myLinkButton" runat="server" Text="Status" 
     CommandName="myLinkButton"></asp:LinkButton>
Run Code Online (Sandbox Code Playgroud)

最后,在RowCommand事件中,您可以首先检查事件是否由 a 引发LinkButton,然后安全地使用 ae.CommandSource属性,LinkButton并从那里找到 Gridview 的包含行。

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
   if (e.CommandName == "myLinkButton")
   {
      LinkButton lnk = (e.CommandSource) as LinkButton;
      GridViewRow clickedRow = lnk.NamingContainer as GridViewRow;
   }
}
Run Code Online (Sandbox Code Playgroud)