2012-11-14 38 views
2

我创建了一堆复选框动态:ASP.NET:如何访问动态创建的控制

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我的CheckBox希望chkRead复选框进行检查以及

CheckBox_CheckedChanged事件我只能访问到被点击 的复选框,但我不知道该怎么检查该事件中的其他复选框。

+0

你试过'control.FindControl(“chk1”);'?如果您在回发中重新创建动态复选框,您应该可以访问它... –

+0

@Robert Koritnik是的,我试过,但它返回null。我应该提到复选框位于Div控件中,而该控件又位于另一个ul/li元素中。 –

+1

ASP.NET FindControl不是递归的。您需要深入研究这一点,或者在chkRead添加到的容器上调用FindControl。 – Igor

回答

3

这是从内存,但你可以做这样的事情:

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来做,那是一个不同的问题。

这也假定chk1chk2是在同一个命名容器中。如果不是,事情会变得复杂。

+0

'chkRead'可能是本地方法变量,而不是全局页面变量/属性...因此,这个问题。我希望OP知道这一点。 –

+1

@RobertKoritnik是;我只是纠正它。 –

+1

@RobertKoritnik事实上,你给了我一个主意。再次编辑。 –

2

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

+1

我想你应该提到字典可以是页面级本地内存变量,所以人们不会把它放在会话或任何其他有对象的缓存中...... :)然后,这个字典将填充每个页面请求创建动态控件时。很好很简单。比控制树遍历更好(也更快)。 +1 –

0

如果要动态做到这一点,你可以将属性添加到你有兴趣in--你checkboxess可以再循环在Page.Controls收集和测试您遍历控制具有属性,然后你可以检查,或取消选中它。

一些伪代码:

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

在阅读您的评论关于嵌套controls--这可能是一个有点hassle--我倾向于伊戈尔同意的,你应该把ID的集合中因为它们是动态添加的。

+1

ID也是一个属性。为什么我们需要更多? –

0

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