【问题标题】:Loop through all the user controls on a page循环浏览页面上的所有用户控件
【发布时间】:2010-04-13 18:49:17
【问题描述】:

想要遍历页面上存在的所有用户控件并获取它们的 ID。我该怎么做?

【问题讨论】:

  • 这是 WinForms、WPF 还是 ASP.NET?我怀疑是后者,但你永远不知道。
  • “用户控件”是指托管控件还是特别是用户控件 (.ascx)?
  • @ChrisF:你猜对了! ASP.Net 它是@CAbbott: .ascx

标签: c# asp.net


【解决方案1】:

要获取每个用户控件,您必须测试控件的类型:

编辑:我修改了我的示例以递归方式遍历所有控件:

方法

public void GetUserControls(ControlCollection controls)
{
    foreach (Control ctl in controls)
    {
        if (ctl is UserControl)
        {
            // Do whatever.
        }

        if (ctl.Controls.Count > 0)
            GetUserControls(ctl.Controls);
    }
}

调用

GetUserControls(Page.Controls);

【讨论】:

  • if (curControl is UserControl) 永远不会为真。而且我在页面上有一个用户控件
  • 我已经在我有用户控件的页面上对此进行了测试,并且它找到了它。您是否从System.Web.UI.UserControl 获得控制权?
【解决方案2】:

这应该可行:

var listOfUserControls = GetUserControls(Page);

...

public List<UserControl> GetUserControls(Control ctrl)
{
  var uCtrls = new List<UserControl>();
  foreach (Control child in ctrl.Controls) {
    if (child is UserControl) uCtrls.Add((UserControl)child);
    uCtrls.AddRange(GetUserControls(child);
  }

  return uCtrls;
}

【讨论】:

    【解决方案3】:
    foreach(Control control: Page.Controls)
    {
    
        //do something with control object
    
    }
    

    【讨论】:

    • 但是,它会循环遍历所有控件。如何区分用户控件。 GetType()??
    • 控件可以嵌套,因此您需要一个递归函数来循环所有控件。
    【解决方案4】:

    我为此创建了一个扩展方法,它与 LINQ 配合得非常好。

    <Extension()>
    Public Function DecendentControls(ParentControl As Control) As Control()
        Dim controls As New List(Of Control)
    
        For Each myControl As Control In ParentControl.Controls
            controls.Add(myControl)
            controls.AddRange(myControl.DecendentControls)
        Next
    
        Return controls.ToArray
    End Function
    

    然后使用 LINQ,您可以执行以下操作来将页面上的所有复选框设置为未选中:

    For Each myControl As CheckBox In pnlMain.DecendentControls.Where(Function(x) TypeOf x Is CheckBox)
        myControl.Checked = False
    Next
    

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      相关资源
      最近更新 更多