ASP.NET:如何访问动态创建的控件

ASP.NET:如何访问动态创建的控件,asp.net,dynamic,checkbox,Asp.net,Dynamic,Checkbox,我正在动态创建一组复选框: CheckBox chkRead = new CheckBox(); chkRead.ID = "chk1"; chkRead.AutoPostBack = true; chkRead.CheckedChanged += new EventHandler(CheckBox_CheckedChanged); CheckBox chkPost = new CheckBox(); chkRead.ID = "chk2"; chkPost.AutoPostBack = tr

我正在动态创建一组复选框:

CheckBox chkRead = new CheckBox();
chkRead.ID = "chk1";
chkRead.AutoPostBack = true;
chkRead.CheckedChanged += new EventHandler(CheckBox_CheckedChanged);

CheckBox chkPost = new CheckBox();
chkRead.ID = "chk2";
chkPost.AutoPostBack = true;
chkPost.CheckedChanged += new EventHandler(CheckBox_CheckedChanged);


 protected void CheckBox_CheckedChanged(object sender, EventArgs e)
 {
     CheckBox chk = (CheckBox)sender;


 }
我想做的是: 当我选中chkPost复选框时,我希望也选中chkRead复选框

复选框\u CheckedChanged事件中,我只能访问单击的复选框
但我不知道如何从该事件中选中另一个复选框。

由于是您的代码创建了复选框,您可以将它们的引用存储在列表或字典中,并在需要时按id检索它们。

这是从内存中获取的,但您可以执行以下操作:

protected void CheckBox_CheckedChanged(object sender, EventArgs e)
{
    CheckBox chk = (CheckBox)sender;
    CheckBox chkPost = (CheckBox) chk.NamingContainer.FindControl("chk2");
    CheckBox chkRead = (CheckBox) chk.NamingContainer.FindControl("chk1");
    if(chk == chkPost && chk.Checked)
    {  
        chkRead.Checked = true;
    }
} 
这是假设您希望在回发后在代码隐藏中执行所有这些操作。如果你想用javascript来做,那是另一个问题


这还假设
chk1
chk2
位于同一命名容器中。如果不是这样,事情就会变得复杂

如果要动态执行此操作,可以向感兴趣的复选框中添加一个属性,然后可以在页面上循环。控件集合并测试正在循环的控件是否具有该属性,然后可以选中或取消选中该属性

一些伪代码:

foreach(var control in Page.Controls)
  if(typeof(Control) is CheckBox and ((CheckBox)control).Attributes["myAttr"] != null)
     //check or uncheck it

在阅读您关于嵌套控件的评论时——这可能有点麻烦——我倾向于同意Igor的观点,即在动态添加id时,您应该将id放入集合中。

您能将代码粘贴到创建这些复选框的位置吗?是“奥尼特”还是其他什么地方?您是否将这些复选框放在容器中,您是将这些控件存储为全局变量还是在方法中创建它们?

您是否尝试过
control.FindControl(“chk1”)?如果在回发时重新创建了动态复选框,则应该能够访问它…ASP.NET FindControl不是递归的。您需要对此进行深入研究,或者在添加chkRead的容器上调用FindControl。但是您是否使用
FindControl
遍历容器以访问您的复选框?@RobertKoritnik感谢您提出的所有建议,我认为使用NamingContainer来查找chk所在的容器,正如Ann L所建议的那样。成功了,这正是我所需要的。是的,这简化了遍历,因为您可以立即访问容器,而无需遍历整个页面控件层次结构。好主意,是的。我已经授予它。。。它还表明遍历同样有效,但会有更高的性能损失。
chkRead
可能是局部方法变量,而不是全局页面变量/属性。。。这就是问题所在。“我希望OP知道这一点。”罗伯特科里特尼克事实上,你给了我一个主意。再次编辑。@AnnL。使用NamingContainer找到chk所在的控件真是天才,谢谢你,安,这正是我所需要的。安,这是个好主意。我很高兴我也能帮上忙……;)ID也是一个属性。为什么我们需要更多?我想你们应该提到字典可以是页面级的本地内存变量,这样人们就不会把它放在会话或任何其他支持对象的缓存中……:)然后,在创建动态控件时,将在每个页面请求上填充此字典。又好又简单。比控制树遍历更好(更快)+1.