嵌套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
相关产品推荐
相关产品推荐

