ASP.NET GridView中获取ddlDesc与txtBoxDesc的列索引值
解决ASP.NET GridView中控件列索引获取问题
嘿,我来帮你搞定这个列索引的问题!你已经能拿到行数据,差的就是找到控件对应的列索引啦,这里有两种靠谱的方法,你可以根据自己的情况选:
方法一:通过控件父容器获取TableCell的CellIndex
这个方法适合控件直接放在GridView的TableCell里的场景(比如没嵌套Panel这类容器),核心思路是找到控件所在的TableCell,然后拿它的CellIndex属性:
后台按钮点击事件代码
protected void btnShowColumnIndex_Click(object sender, EventArgs e) { // 遍历GridView的每一行 foreach (GridViewRow row in GridView1.Rows) { // 找到行里的ddlDesc和txtBoxDesc控件 DropDownList ddlDesc = row.FindControl("ddlDesc") as DropDownList; TextBox txtBoxDesc = row.FindControl("txtBoxDesc") as TextBox; if (ddlDesc != null) { // 找到控件所在的TableCell(如果控件嵌套了容器,需要循环向上找) Control parentControl = ddlDesc.Parent; while (parentControl != null && !(parentControl is TableCell)) { parentControl = parentControl.Parent; } TableCell ddlCell = parentControl as TableCell; if (ddlCell != null) { int ddlColIndex = ddlCell.CellIndex; // 注册前端脚本弹出提示(后台不能直接用MessageBox,要在客户端弹出) ClientScript.RegisterStartupScript(this.GetType(), $"ddlAlert_{row.RowIndex}", $"alert('第{row.RowIndex + 1}行,ddlDesc的列索引:{ddlColIndex}');", true); } } if (txtBoxDesc != null) { Control parentControl = txtBoxDesc.Parent; while (parentControl != null && !(parentControl is TableCell)) { parentControl = parentControl.Parent; } TableCell txtCell = parentControl as TableCell; if (txtCell != null) { int txtColIndex = txtCell.CellIndex; ClientScript.RegisterStartupScript(this.GetType(), $"txtAlert_{row.RowIndex}", $"alert('第{row.RowIndex + 1}行,txtBoxDesc的列索引:{txtColIndex}');", true); } } } }
说明
- 如果你的控件直接在
ItemTemplate里(没嵌套其他容器),那可以直接用ddlDesc.Parent as TableCell,不用循环找父容器; CellIndex是从0开始计数的,所以第一列索引是0,第二列是1,符合常规的索引逻辑。
方法二:通过GridView列的UniqueName获取索引(更推荐)
这种方法更稳定,不管控件在TemplateField里嵌套多少层,只要给列设置好UniqueName,就能直接拿到列索引,步骤如下:
第一步:修改GridView前端代码,给列加UniqueName
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"> <Columns> <!-- 给ddlDesc所在的列设置UniqueName --> <asp:TemplateField UniqueName="Column_DdlDesc"> <ItemTemplate> <asp:DropDownList ID="ddlDesc" runat="server"></asp:DropDownList> </ItemTemplate> </asp:TemplateField> <!-- 给txtBoxDesc所在的列设置UniqueName --> <asp:TemplateField UniqueName="Column_TxtBoxDesc"> <ItemTemplate> <asp:TextBox ID="txtBoxDesc" runat="server"></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
第二步:后台按钮点击事件代码
protected void btnShowColumnIndex_Click(object sender, EventArgs e) { // 提前获取两个列的索引,不用每次遍历行都找一次 int ddlColIndex = GridView1.Columns.Cast<DataControlField>() .ToList() .FindIndex(col => col.UniqueName == "Column_DdlDesc"); int txtColIndex = GridView1.Columns.Cast<DataControlField>() .ToList() .FindIndex(col => col.UniqueName == "Column_TxtBoxDesc"); // 遍历每一行弹出提示 foreach (GridViewRow row in GridView1.Rows) { ClientScript.RegisterStartupScript(this.GetType(), $"RowAlert_{row.RowIndex}", $"alert('第{row.RowIndex + 1}行:\\nddlDesc列索引={ddlColIndex}\\ntxtBoxDesc列索引={txtColIndex}');", true); } }
说明
- 这种方法的好处是不用关心控件的嵌套结构,只要列的
UniqueName正确,就能直接拿到索引; - 如果你的GridView是动态绑定列的,只要确保动态生成列时设置好
UniqueName,同样适用。
注意事项
- 后台不能直接用
MessageBox.Show()弹出提示,因为ASP.NET是服务器端代码,需要注册前端的alert脚本才能在客户端弹出; - 如果你的页面用了
UpdatePanel,要把ClientScript.RegisterStartupScript换成ScriptManager.RegisterStartupScript,否则脚本不会生效。
内容的提问来源于stack exchange,提问作者freej17
相关产品推荐
相关产品推荐

