2

我很擅长使用 加载控件,LoadControl("~/vitrualPath")所以我有:

UserControl ctrl = (UserControl)LoadControl("~/controls/someControl.ascx");
this.Controls.Add(ctrl);
//plcCtrl.Controls.Add(ctrl);

问题是我希望遍历用户控件中的所有控件:

foreach (Label c in this.Controls.OfType<Label>())
{
  // It's a label for an input
  if (c.ID.Substring(0, 8) == "lblInput")
   {
     // Do some stuff with the control here
   }
}

但是,添加的控件不是 的一部分this,而是ctrl

有没有一种方法可以将加载的控件的内容添加到其中,或者this有一种方法可以一次循环遍历两者?thisctrl

4

5 回答 5

2

如果您只是想遍历顶级标签和标签 in ctrl,请尝试this.Controls.Concat(ctrl.Controls).OfType<Label>()在您的foreach循环中。

您还可以将您的移动if到 LINQWhere调用中:

.Where(l => l.ID.Substring(0, 8) == "lblInput")

于 2012-06-07T10:56:25.777 回答
1

通过使用递归函数,您无需担心子级别/容器中的控件。这样的事情应该没问题(您需要做的就是传递顶级控件以及您感兴趣的 id 子字符串)。因此,如果满足条件,它将执行您打算对控件和任何子级别执行的任何操作。

public void ProcessControl(Control control, string ctrlName)
{
    foreach (Label c in control.Controls.OfType<Label>())
   {
       // It's a label for an input
       if (c.ID.Substring(0, 8) == ctrlName)
       {
            // Do some stuff with the control here
       }
    }

    foreach (Control ctrl in control.Controls)
    {
        ProcessControl(ctrl, ctrlName);        
    }    
}
于 2012-06-07T11:30:01.403 回答
0

您应该编写一个递归方法,开始循环 this.Controls 中的控件并沿着控件树向下移动。然后它也会进入您的用户控件并找到您的标签。

于 2012-06-07T10:55:48.507 回答
0

我认为没有一种方法可以像您想要的那样循环遍历两者。

您可以轻松地创建一个接收 Control 作为参数的方法,并通过它的控件进行迭代。像这样的东西:

void Function(Control control)
{
    foreach (Label c in control.Controls.OfType<Label>())
    {
       // It's a label for an input
       if (c.ID.Substring(0, 8) == "lblInput")
       {
         // Do some stuff with the control here
       }
    }
}
于 2012-06-07T10:56:08.890 回答
0

您应该能够通过访问我认为访问用户控件内部的控件this.Controls[index].Controls,但这有点取决于您要实现的目标?他们可能是一种更清洁的方式来做你想做的事情?

于 2012-06-07T10:56:49.380 回答