通过web控件循环出现问题



我有一个网页,我在Page_Load事件期间动态创建控件(这是这样做的,因为我不知道我需要多少控件,直到会话是活跃的,某些变量是可访问的)

我需要能够循环通过这些控件查找复选框时,一个按钮单击处理。循环遍历表单。控制措施似乎还不够。我认为Request.Form可能会工作,但它似乎不能在我的c#块访问?

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

有没有人这样做与动态创建控件之前?

来自MSDN的简化示例:

var myControl = FindControl("NameOfControl");
if(myControl != null)
{
   //do something
}
else
{
   //control not found
}

希望这对你有帮助!div;)

您的控件将可以通过其直接父控件的Controls集合访问。除非你像Page.Form.Controls.Add (myControl);一样添加它们,否则你不会在Page.Form.Conttrols中找到它。如果您将它们添加到占位符中,则必须在thePlaceHolder.Controls中找到它们。

LinkButton myDynamicLinkButton = new myDynamicLinkButton ();
myDynamicLinkButton.ID = "lnkButton";
myPlaceHolder.Controls.Add (myDynamicLinkButton);
//........
LinkButton otherReferenceToMyLinkButton = myPlaceHolder.FindControl ("lnkButton");

正如@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代码中的任何地方的Request["xyz"]。您可以像上面描述的那样找到控件并读取它的值,或者使用Control.UniqueID属性直接从Request中读取。例如,如果它是中继器中的一个复选框那么UniqueID将会是dtgData$ctl02$txtAmount

感谢大家的真知灼见。我参加了讨论,并继续进行下去,找到了最适合我的解决方案。

foreach(String chk in Request.Form) 
{
    if (chk.Contains("chkRemove")) 
    {
        int idxFormat = chk.LastIndexOf("chkRemove"); 
        objectname = chk.Substring(idxFormat);
    }
}

结果我需要的只是名字。字符串的末尾包含一个数字,用于确定数据项的位置。谢谢你的建议!

最新更新