【问题标题】:ASP.NET: How to access a dynamically created controlASP.NET:如何访问动态创建的控件
【发布时间】:2012-11-03 06:14:22
【问题描述】:

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

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

CheckBox_CheckedChanged 事件中,我只能访问被点击的 CheckBox 但我不知道如何检查该事件中的另一个复选框。

【问题讨论】:

  • 你试过control.FindControl("chk1");吗?如果您在回发时重新创建了动态复选框,您应该能够访问它...
  • ASP.NET FindControl 不是递归的。您需要深入了解这一点,或者在添加 chkRead 的容器上调用 FindControl。
  • 但是您是否使用FindControl 遍历容器以到达您的复选框?
  • @RobertKoritnik 感谢您提出的所有建议,我认为使用 NamingContainer 来查找 chk 所在的容器,正如 Ann L. 所建议的那样,这正是我所需要的。
  • 是的,这简化了遍历,因为您无需遍历整个页面控件层次结构即可立即进入容器。好主意是的。我已经授予它了……它还表明遍历也可以正常工作,但性能损失要高得多。

标签: asp.net dynamic checkbox


【解决方案1】:

这是凭记忆,但你可以这样做:

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 在同一个命名容器中。如果不是,事情就会变得复杂。

【讨论】:

  • chkRead 可能是本地方法变量,而不是全局页面变量/属性...因此是问题所在。我希望 OP 知道这一点。
  • @RobertKoritnik 事实上,你给了我一个想法。再次编辑。
  • @AnnL。使用 NamingContainer 找到 chk 所在的控件是天才,谢谢 Ann,这正是我所需要的。
  • 这是个好主意,安。我很高兴我也有一些帮助... ;)
【解决方案2】:

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

【讨论】:

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

如果您想动态地执行此操作,您可以向您感兴趣的复选框添加一个属性 - 然后您可以遍历 Page.Controls 集合并测试您循环的控件是否具有该属性,然后您可以选中或取消选中。

一些伪代码:

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

在阅读您对嵌套控件的评论时(这可能有点麻烦),我倾向于同意 Igor 的观点,即您应该将 id 放在一个集合中,因为它们是动态添加的。

【讨论】:

  • ID 也是一个属性。为什么我们需要更多?
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多