【问题标题】:Setting modifiers for dynamically created controls为动态创建的控件设置修饰符
【发布时间】:2013-03-24 18:00:43
【问题描述】:

我在运行时创建了一些controls,如下所示:

pnl1.Controls.Add(New TextBox() With _
{
    .Name = "ItemName", _
    .Anchor = AnchorStyles.Left + AnchorStyles.Right _
}

我尝试将其修饰符设置为Public。不幸的是,我所有的尝试都失败了。
我的问题是:我们可以为动态创建的控件设置修改器吗?

如果没有,那么我如何访问其他forms 中的那些controls? (例如: Form1 具有动态创建的控件 ctrl1Form2,它们存在于 Form1MDI container 内部)。

如何从Form2 访问ctrl1? (如果没有在form1 中为ctrl1 设置public 修饰符,我们无法像这样me.parentform.ctrl1Form2 访问它)

【问题讨论】:

    标签: vb.net winforms access-modifiers


    【解决方案1】:

    您错过了,访问修饰符在编译时用于描述表单的类,而不是在运行时。访问修饰符不是安全机制!

    例如,将 3 个TextBoxes 添加到表单中。给他们访问修饰符Private,现在创建一个表单实例并运行以下代码:

    Dim form as Form1
    
    For Each c As Control In form.Controls
        MessageBox.Show(c.Name)
    

    你会得到 3 个MessageBoxes,告诉你这 3 个TextBoxes 的名字,即使它们的访问修饰符是Private。与Public 的不同之处在于你不能写这样的代码:

    MessageBox.Show(form.TextBox1.Name)
    

    您不能以这种方式访问​​类的私有成员。但是,members 在编译时可用。它们与类一起声明。在这种情况下,它们简化了对Control 的访问。

    在运行时向表单添加控件将不会在类中创建新成员!它不能,因为你的类必须被修改、重新编译、重新实例化等等。

    结论

    1. 声明您的成员 Private 不会阻止对象访问它们的控件 封装。
    2. 在运行时创建控件不会影响类。
    3. 您可能正在寻找像 MVCMVVM 这样的设计模式。

    【讨论】:

      【解决方案2】:

      如果不是动态的,Visual Studio 默认将控件设置为Friend With Events,在 Vb.NET 中,在添加到表单之前声明它们。您也可以这样做,声明一个 Public List(Of Control)(例如)并在动态创建控件时添加控件。

      或者更好的是,Dictionary(Of String, Control) 可以通过其名称访问控件。

      或者您可以从表单中获取它们。使用Form1.Controls,您可以访问表单中的所有控件。如果您的控件位于另一个控件内,则需要访问该控件内的控件,例如:

      Dim btn As Label = Ctype(Form1.Controls("GroupBox1").Controls("Label1"), Label)
      

      【讨论】:

      • +1 不错的解决方案。我会尝试一下,如果可行,请告诉您。
      • 抱歉,忘记接受它作为我的回答。我一直在使用你的想法。你建议我使用公共列表(控制),但我稍微修改了一下。我所做的是在运行时我将我的控件添加到一个具有公共修饰符的面板中。无论如何谢谢。
      猜你喜欢
      • 2017-08-07
      • 2013-01-25
      • 1970-01-01
      • 2012-05-30
      • 2011-04-12
      • 1970-01-01
      • 2011-06-23
      • 2011-06-10
      • 2011-06-27
      相关资源
      最近更新 更多