如何在LinkBut​​ton Click事件的GridView中获取单元格值?还是RowCommand?

时间:2019-01-17 17:51:08

标签: c# asp.net gridview datagridview

我有一个GridView,其中包含多个记录和几个名为“编辑”和“详细信息”的链接按钮。现在,当用户单击明细链接按钮时,我想获取用户名(NOT索引)。如“姓名”,“父亲姓名”等 这是.aspx代码

<asp:GridView ID="dgvEmployeesInformation" runat="server" CssClass=" table table-bordered table-hover table-responsive" DataKeyNames="Id" AutoGenerateColumns="False" OnRowCommand="dgvEmployeesInformation_RowCommand" OnRowDataBound="dgvEmployeesInformation_RowDataBound" AllowPaging="True" AllowSorting="True" OnPageIndexChanging="dgvEmployeesInformation_PageIndexChanging">
    <%--1st Column--%>
    <Columns>
        <asp:BoundField HeaderText="ID" DataField="Id" ControlStyle-BackColor="#0066ff" Visible="False">
            <ControlStyle BackColor="#0066FF"></ControlStyle>
        </asp:BoundField>
        <asp:BoundField HeaderText="Name" DataField="Name" />
        <asp:BoundField HeaderText="Employee No" DataField="EmployeeNo" />
        <asp:BoundField HeaderText="Father Name" DataField="FatherName" />
        <asp:HyperLinkField DataNavigateUrlFields="Id" DataNavigateUrlFormatString="AddEmployeeBasic1.aspx?thid={0}" HeaderText="Update" NavigateUrl="~/AddEmployeeBasic1.aspx" Text="Edit" />
        <asp:TemplateField HeaderText="Action" ShowHeader="True">
            <ItemTemplate>
                <asp:LinkButton ID="lbDelete" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton runat="server" ID="lbDetail" OnClick="lbDetail_Click" DataNavigateUrlFields="Id" DataNavigateUrlFormatString="EmployeesDetails.aspx?EmpID={0}" NavigateUrl="~/EmployeesDetails.aspx" HeaderText="Show Detail" Text="Detail"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

这是lbDetail_Click代码

protected void lbDetail_Click(object sender, EventArgs e)
{
    GridViewRow clickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;
    Label lblUserName = (Label)clickedRow.FindControl("Name");
    EmployeeID.EmpName = lblUserName.ToString();
}

当我将程序置于调试模式时,lblUserName返回NULL 这是图片。 enter image description here

我想要的是,当用户单击Detail LinkBut​​ton时,然后在lbDetail Click事件上,它获取Employee的名称并将其存储在静态变量中。以下是图片 enter image description here

我不知道如何解决此问题。请帮助我。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

lblUserName为空,因为它不是Label,而是BoundField。 您可以做得到单元格值。

protected void lbDetail_Click(object sender, EventArgs e)
{
    GridViewRow clickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;
    Label1.Text = clickedRow.Cells[1].Text;
}

或使用包含标签Name的TemplateField

<asp:TemplateField HeaderText="Name">
    <ItemTemplate>
        <asp:Label ID="Name" runat="server" Text='<%# Eval("Name")%>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

答案 1 :(得分:1)

我只是将数据属性添加到详细信息按钮,然后在后面的代码中获取它的值。

例如:

1。)将新的data-myData ='<%#Eval(“ Name”)%>'属性及其值添加到按钮

                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:LinkButton runat="server" ID="lbDetail" OnClick="lbDetail_Click" Text="Detail" data-ID='<%# Eval("ID") %>' data-myData='<%# Eval("Name") %>' ></asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>

2。)从事件处理程序中获取这些数据

protected void lbDetail_Click(object sender, EventArgs e)
{
     LinkButton button = (LinkButton)sender;
     var name = (string)button.Attributes["data-myData"];
     var selectedID = (string)button.Attributes["data-ID"];
     Session["selectedID"] = selectedID ;
}

答案 2 :(得分:0)

这是代码的外观:

protected void lbDetail_Click(object sender, EventArgs e)
{
    GridViewRow clickedRow = ((LinkButton)sender).NamingContainer as GridViewRow;
    var username = clickedRow.Cells[1].Text;
    if(string.IsNullOrEmpty(username))
    {
        return;
    }
    EmployeeID.EmpName = username;
}