C# 在web控件中循环出现问题
我有一个网页,我在页面加载事件期间动态创建控件。之所以这样做,是因为我不知道在会话激活和某些变量可访问之前,我需要多少控件 我需要能够循环通过这些控件,在处理按钮单击时找到复选框。在表单中循环。控件似乎不够。我认为Request.Form可能会工作,但在我的C块中似乎无法访问它 Request.Form的代码应该是什么样的?或 以前是否有人使用动态创建的控件执行过此操作C# 在web控件中循环出现问题,c#,asp.net,C#,Asp.net,我有一个网页,我在页面加载事件期间动态创建控件。之所以这样做,是因为我不知道在会话激活和某些变量可访问之前,我需要多少控件 我需要能够循环通过这些控件,在处理按钮单击时找到复选框。在表单中循环。控件似乎不够。我认为Request.Form可能会工作,但在我的C块中似乎无法访问它 Request.Form的代码应该是什么样的?或 以前是否有人使用动态创建的控件执行过此操作 非常感谢您的见解。MSDN中的简化示例: var myControl = FindControl("NameOfControl
非常感谢您的见解。MSDN中的简化示例:
var myControl = FindControl("NameOfControl");
if(myControl != null)
{
//do something
}
else
{
//control not found
}
希望这有帮助 您的控件可以通过其直接父控件的控件集合进行访问。除非像Page.Form.Controls.add myControl;,那样添加它们;,在Page.Form.controls中找不到它。如果将它们添加到占位符中,则必须在PlaceHolder.Controls中找到它们
正如@David在评论中所说的,你可能应该考虑改用中继器。这可能会大大简化您的案例。因为这些控件可能嵌套在其他控件中,所以您需要递归搜索。您可以使用此方法查找控件:
public Control FindControlRecursive(Control root, string id)
{
if (root.ID == id)
{
return root;
}
foreach (Control c in root.Controls)
{
Control t = FindControlRecursive(c, id);
if (t != null)
{
return t;
}
}
return null;
}
您可以通过以下方式实现它:
CheckBox check = FindControlRecursive(Page.Form, "CheckBox1");
您应该可以访问aspx.cs代码中的任意位置的请求[xyz]。您可以如上所述查找控件并读取其值,也可以使用control.UniqueID属性直接从请求中读取。例如,如果它是中继器中的复选框,那么UniqueID将看起来像dtgData$ctl02$txtmount感谢insight的帮助。我接受了这个讨论,然后继续讨论,找到了最适合我的解决方案
foreach(String chk in Request.Form)
{
if (chk.Contains("chkRemove"))
{
int idxFormat = chk.LastIndexOf("chkRemove");
objectname = chk.Substring(idxFormat);
}
}
事实证明我所需要的只是名字。字符串末尾包含一个数字,用于确定datatable项的位置。谢谢你的建议 如果可以避免创建控件,则会更容易。我个人更喜欢使用中继器来创建控件。您的问题主要来自这样一个事实:在您尝试循环通过之前,您的控件没有被重新创建。。。每次回发时都需要重新创建动态创建的控件。您的C块是什么样子的?它在哪里?你能发一些吗?谢谢insight的朋友们。我接受了这个讨论,然后继续讨论,找到了最适合我的解决方案。Request.Form{if chk.ContainschkRemove中的foreachString chk{int idxFormat=chk.LastIndexOfchkRemove;objectname=chk.SubstringidxFormat;事实证明,我真正需要的只是名称。字符串末尾包含一个数字,用于确定datatable项的位置。感谢您的建议!哇,代码没有格式化…抱歉。这不适用于无法访问在Page_Load事件中创建的控件,因为它不包含在ViewState中。您会找到一个控件,但该控件不是同一个控件,并且其状态会不同。
foreach(String chk in Request.Form)
{
if (chk.Contains("chkRemove"))
{
int idxFormat = chk.LastIndexOf("chkRemove");
objectname = chk.Substring(idxFormat);
}
}