C# 在web控件中循环出现问题

C# 在web控件中循环出现问题,c#,asp.net,C#,Asp.net,我有一个网页,我在页面加载事件期间动态创建控件。之所以这样做,是因为我不知道在会话激活和某些变量可访问之前,我需要多少控件 我需要能够循环通过这些控件,在处理按钮单击时找到复选框。在表单中循环。控件似乎不够。我认为Request.Form可能会工作,但在我的C块中似乎无法访问它 Request.Form的代码应该是什么样的?或 以前是否有人使用动态创建的控件执行过此操作 非常感谢您的见解。MSDN中的简化示例: var myControl = FindControl("NameOfControl

我有一个网页,我在页面加载事件期间动态创建控件。之所以这样做,是因为我不知道在会话激活和某些变量可访问之前,我需要多少控件

我需要能够循环通过这些控件,在处理按钮单击时找到复选框。在表单中循环。控件似乎不够。我认为Request.Form可能会工作,但在我的C块中似乎无法访问它

Request.Form的代码应该是什么样的?或

以前是否有人使用动态创建的控件执行过此操作


非常感谢您的见解。

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);
    }
}