You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套GridView中点击LinkButton获取DataKey值的实现方法

解决嵌套GridView中子LinkButton获取DataKey的问题

我明白你现在遇到的问题——嵌套GridView结构下,点击子GridView(GridView2)里的LinkButton时,没法正确获取对应的DataKey值。你的原代码出错是因为对NamingContainer的层级判断错了,我给你整理了两种可行的解决方法,分别对应只拿子GridView的DataKey,以及同时获取父、子GridView的DataKey的场景:

方法一:仅获取子GridView(GridView2)的DataKey值

这是最基础的场景,直接修正你原有的代码逻辑即可:

protected void lbCode_Click(object sender, EventArgs e)
{
    // 1. 获取触发点击的LinkButton控件
    LinkButton lb = sender as LinkButton;
    
    // 2. 获取该LinkButton所在的子GridView行(GridView2的Row)
    GridViewRow childRow = lb.NamingContainer as GridViewRow;
    
    // 3. 获取该行所属的子GridView(GridView2)——注意这里是从行的NamingContainer拿,不是从行里FindControl
    GridView childGridView = childRow.NamingContainer as GridView;
    
    // 4. 通过子GridView的DataKeys集合 + 当前行的RowIndex获取对应DataKey值
    if (childGridView != null && childGridView.DataKeys != null && childRow.RowIndex >= 0)
    {
        // 替换成你实际需要的DataKey名称或索引
        string childDataKey = childGridView.DataKeys[childRow.RowIndex].Value.ToString();
        // 这里可以添加你的业务逻辑,比如输出或使用这个DataKey
        Response.Write("子GridView的DataKey值:" + childDataKey);
    }
}

关键逻辑解释:

  • 你的原代码错误地在子GridView行里FindControl("GridView2"),但子GridView行本身就是GridView2的一部分,正确的做法是通过childRow.NamingContainer拿到它所属的GridView2实例。
  • 一定要做非空判断,避免空引用异常。

方法二:同时获取父GridView(GridView1)和子GridView(GridView2)的DataKey值

如果你的业务需要同时拿到父、子两层的DataKey,可以再往上追溯一层NamingContainer:

protected void lbCode_Click(object sender, EventArgs e)
{
    LinkButton lb = sender as LinkButton;
    GridViewRow childRow = lb.NamingContainer as GridViewRow;
    GridView childGridView = childRow.NamingContainer as GridView;
    
    // 获取父GridView的行:子GridView的NamingContainer就是父GridView的Row
    GridViewRow parentRow = childGridView.NamingContainer as GridViewRow;
    GridView parentGridView = parentRow.NamingContainer as GridView;
    
    // 获取子GridView的DataKey
    string childDataKey = childGridView.DataKeys[childRow.RowIndex].Value.ToString();
    // 获取父GridView的DataKey
    string parentDataKey = parentGridView.DataKeys[parentRow.RowIndex].Value.ToString();
    
    // 业务逻辑处理
    Response.Write("父GridView的DataKey值:" + parentDataKey + "<br/>子GridView的DataKey值:" + childDataKey);
}

额外注意事项:

  • 确保你在ASPX页面中已经给GridView1和GridView2都设置了DataKeyNames属性,比如:
    <asp:GridView ID="GridView1" runat="server" DataKeyNames="ParentID">
        <!-- 父GridView模板列,包含子GridView -->
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:GridView ID="GridView2" runat="server" DataKeyNames="ChildID">
                        <!-- 子GridView模板列,包含LinkButton -->
                        <Columns>
                            <asp:TemplateField>
                                <ItemTemplate>
                                    <asp:LinkButton ID="lbCode" runat="server" OnClick="lbCode_Click">点击获取DataKey</asp:LinkButton>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    
  • 如果你的DataKey是多个字段,可以通过DataKeys[行索引]["字段名"]来获取对应的值。

内容的提问来源于stack exchange,提问作者Yahya Hussaini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:40:39