如何读取绑定到自动生成列GridView的布尔值
问题描述
我将Session数据绑定到自动生成列的GridView中,用于会话过期时恢复数据。GridView的代码如下:
<asp:GridView ID="GridView_SessionTable" runat="server" AutoGenerateColumns="true"/>
布尔列会被渲染为复选框,但我尝试了多种方式都无法获取这些列的值。当前用于取值的代码如下:
protected void ScanGrid(object sender, EventArgs e) { foreach (GridViewRow row in GridView_SessionTable.Rows) { Test.Text = Test.Text + "ID: " + row.Cells[0].Text + "Boolean Value:" + row.Cells[4].Text; } }
其他非布尔列的值都能正常获取,肯定有办法拿到布尔列的状态。查看页面源码后,发现该布尔列单元格的HTML结构为:
<span class="aspNetDisabled" title="Selectable"><input id="GridView_SessionTable_ctl00_0" type="checkbox" name="GridView_SessionTable$ctl02$ctl00" checked="checked" disabled="disabled" /></span>
解决方案
自动生成的布尔列是作为CheckBox控件渲染的,并非直接的文本内容,因此不能通过row.Cells[4].Text获取值,需要从单元格中定位到对应的CheckBox控件:
修改ScanGrid方法如下:
protected void ScanGrid(object sender, EventArgs e) { foreach (GridViewRow row in GridView_SessionTable.Rows) { // 从索引为4的单元格中查找CheckBox控件 CheckBox boolCheckBox = row.Cells[4].FindControl("ctl00") as CheckBox; bool isChecked = boolCheckBox != null && boolCheckBox.Checked; Test.Text += $"ID: {row.Cells[0].Text} Boolean Value: {isChecked}\n"; } }
补充说明
- 自动生成的CheckBox控件ID是动态生成的(示例中为
GridView_SessionTable_ctl00_0),如果通过固定后缀ctl00找不到控件,可以遍历单元格内的所有控件来定位:
// 遍历单元格控件找到CheckBox CheckBox boolCheckBox = null; foreach (Control ctrl in row.Cells[4].Controls) { if (ctrl is CheckBox cb) { boolCheckBox = cb; break; } }
- 注意到复选框处于
disabled状态,虽然回发时不会提交该控件的值,但直接从GridView行中获取控件状态不受此影响,只要GridView已正确绑定数据,就能拿到当前的选中状态。
内容的提问来源于stack exchange,提问作者Barnabeck
相关产品推荐
相关产品推荐

