【问题标题】:Access UserControl by name (String)按名称访问 UserControl(字符串)
【发布时间】:2012-11-11 12:07:57
【问题描述】:

我们可以通过名称访问UserControl 吗?例如,我已经创建了一个名为uc1UserControl(在同一个项目中),以及一个名为Panel1Panel,所以类似于:

Dim a As String = "uc1"
Panel1.Controls.Add(a)

【问题讨论】:

    标签: .net vb.net winforms user-controls


    【解决方案1】:

    是的。与您的 sn-p 中的内容不相近,您无法将字符串添加到 Controls 集合中。但是您可以使用字符串索引 Controls 集合以获取控件引用。像这样:

    Dim ctl as New MyUserControl
    ctl.Name = "foo"
    Panel1.Controls.Add(ctl)
    
    ...
    
    Dim ctl as MyUserControl
    ctl = DirectCast(Panel1.Controls("foo"), MyUserControl)
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      Dim c As Control = Me.Controls("uc1")
      

      Dim c As Control = Me.Controls.Find("uc1", True)(0)
      
      If c IsNot Nothing Then
          Panel1.Controls.Add(c)
      End If
      

      但为什么不直接添加:

      Panel1.Controls.Add(uc1)
      

      (假设您的控件在内部存储为uc1 -> Dim uc1 As Control ...。)

      【讨论】:

        【解决方案3】:

        我偶然发现了这个老问题,因为我一直在寻找相同的答案。 前面的答案都假设您已经知道用户控件的名称。如果您想通过给定的字符串变量加载用户控件,则可以使用以下代码。

        Dim ControlName as string = "Namespace.ControlName"
        Dim oType As System.Type = Type.GetType(ControlName)
        Dim obj = System.Activator.CreateInstance(oType)
        Panel1.Controls.Add(obj)
        

        这会将用户控件ControlName 添加到Panel1 控件。如果您的用户控件在同一个项目中,则要使用的命名空间是您自己的根命名空间。您可以在项目属性中找到此命名空间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-05
          相关资源
          最近更新 更多