我有一个包含可变行数的四列表,需要支持选择单行或多行。我决定在其中一个列中使用CheckBoxes来实现此功能,但是在生成控件之后我找不到一种读取控件状态的方法。
首先,我开始使用JQuery将CheckBoxes直接放到客户端的表中,假设我可以在发布表单时使用“FindControl()”查找它。即使在调整它以递归搜索页面上的所有控件之后,FindControl仍然失败了。
经过一些谷歌搜索后,似乎ASP.Net根本不允许或按照我的希望和功能进行操作,而是改变了代码,将所有CheckBox添加到代码文件中的表中,没有区别。< / p>
由于我对使用C#HttpListener更加熟悉,我试图回读已发布的表单数据并自行处理,结果发现ASP使用某种形式的加密或混淆数据呈现它的时间更长消耗任务,甚至看看那个方法的价值。
对于我如何实现这一点几乎没有任何限制,但我根本不了解ASP.Net单独解决这个问题,特别是在谷歌让我失望之后!
如果您需要查看一些代码随时可以询问,但请具体说明。
这是我用TRIED来查找控件的代码,此刻它是一个正确的混乱:
// I assign the name "CHK_SEL_" + i.ToString() to the ID, but that is on a page with a master page. Examining the ID with chrome shows that the ClientID is actually MainContent_CHK_SEL_i, so I search for that too.
Control c = MyFind(this, "CHK_SEL_2");
ControlCollection cc = this.Controls; // Everything except this line, results in null. and after examining this using visual studio, I cannot manually find the controls I am after either.
Control ccc = this.FindControl("CHK_SEL_2");
Control cccc = SearchControl(this, "CHK_SEL_2");
Control ccccc = MyFind(this, "MainContent_CHK_SEL_2");
Control cccccc = this.FindControl("MainContent_CHK_SEL_2");
Control ccccccc = SearchControl(this, "MainContent_CHK_SEL_2");
private Control MyFind(Control search, string ID)
{
int i = 0;
Control c = search.FindControl(ID);
if (c != null) return c;
while (search.Controls.Count > i && (c = MyFind(search.Controls[i++], ID)) == null) ;
return c;
}
public static Control SearchControl(Control controlToSearch, string controlID)
{
if (controlToSearch.ID == controlID) return controlToSearch;
for (int i = 0; i < controlToSearch.Controls.Count; i++)
{
Control c = SearchControl(controlToSearch.Controls[i], controlID);
if (c != null) return c;
}
return null;
}
答案 0 :(得分:1)
您可以找到复选框(已选中或未选中)状态的最简单方法如下:
Table tbl = (Table)form1.FindControl("Table1");
int rows = tbl.Rows.Count;
for (int i=0; i<rows;i++)
{
TableRow tr = tbl.Rows[i];
TableCell tc = tr.Cells[0];
CheckBox cb = (CheckBox)tc.Controls[0];
bool status = cb.Checked;
}