为动态创建的控件设置修饰符

时间:2013-04-03 07:16:49

标签: vb.net winforms access-modifiers

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

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

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

如果没有,那么我如何访问其他controls中的forms? (例如 Form1动态创建控件ctrl1Form2存在于MDI container的{​​{1}}内。

如何从Form1访问ctrl1? (未在Form2中为public设置ctrl1修饰符,我们无法从此form1 Form2访问me.parentform.ctrl1

2 个答案:

答案 0 :(得分:2)

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

例如,将3 TextBox es添加到表单中。为他们提供访问修饰符Private,现在创建表单实例并运行以下代码:

Dim form as Form1

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

即使他们的访问修饰符为MessageBox,您也会获得3个TextBox es,告诉您3个Private es的名称。与Public的区别在于您无法编写如下代码:

MessageBox.Show(form.TextBox1.Name)

您不能以这种方式访问​​类的私人成员。但是,成员在编译时可用。他们与全班同学宣布。在这种情况下,他们简化了对Control

的访问

在运行期间向窗体添加控件将在类中创建新成员!它不能,因为你的课程必须被修改,重新编译,重新安排等等。

结论

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

答案 1 :(得分:1)

当不是dinamically时,Visual Studio默认将控件设置为Friend With Events,在Vb.NET中,在添加到表单之前声明它们。您可以这样做,声明公开List(Of Control)(例如),并在您创建它们时将控件添加到那里。

甚至更好,Dictionary(Of String, Control)可以通过名称访问控件。

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

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