2011-08-18 93 views
0

我有一个网页,我在Page_Load事件期间动态地创建控件(这是因为我不知道需要多少控件,直到会话处于活动状态并且可以访问某些变量)通过Web控制循环的问题

我需要能够遍历这些控件来查找处理按钮单击时的复选框。通过Form.Controls循环似乎是不够的。我认为Request.Form可能会工作,但它似乎不能在我的C#块中访问?

Request.Form应该是什么样子?或

有没有人用动态创建的控件完成此操作?

任何洞察力是赞赏。

+2

如果你可以避免创建控制,那会更容易。我个人喜欢使用中继器来“创建”控件。您的问题prolly来自这样一个事实,即您在尝试循环之前未重新创建您的控件...动态创建的控件需要在每次回发时重新创建。 – David

+0

您的C#块的外观如何?它坐在哪里?你可以发布一些吗? –

+0

感谢有识之士。我有种讨论,并与之一起运行,发现我的解决方案对我来说最合适。 foreach(Request.Form中的字符串chk) { if(chk。包含(“chkRemove”)) { int idxFormat = chk.LastIndexOf(“chkRemove”); objectname = chk.Substring(idxFormat); 原来我真正需要的只是名字。该字符串在末尾包含一个数字,用于确定数据表项的位置。 感谢您的建议! – Encryption

回答

0

感谢您的洞察家伙。我有种讨论,并与之一起运行,发现我的解决方案对我来说最合适。

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

原来我真正需要的只是名字。该字符串在末尾包含一个数字,用于确定数据表项的位置。感谢您的建议!

0

简单的例子来自MSDN:

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

希望这有助于! ;)

+0

这不适用于在Page_Load事件中创建的控件,因为它不包含在ViewState中。你会发现一个控制,但控制不会是相同的控制,它的状态会有所不同。 –

0

您的控件将可通过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"); 

正如@大卫说,在他的评论,你应该考虑使用一个中继器来代替。这可能会大大简化你的情况。

0

由于控件可能嵌套在其他控件中,因此需要递归搜索。您可以使用此方法来找到控制:

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"); 
0

你应该有Request["xyz"]在您aspx.cs代码的任何地方访问。您可以如上所述查找控件并读取它的值,或者直接从请求中使用Control.UniqueID属性读取值。例如,如果它是一个复选框,在中继器内,那么UniqueID看起来像dtgData $ ctl02 $ txtAmount