0

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

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

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

如果没有,那么我如何访问controlsother 中的那些forms?(例如: Form1具有动态创建的控件ctrl1Form2它存在于 ofMDI containerForm1)。

我如何ctrl1访问Form2?(如果不为in设置public修饰符,我们无法像这样访问它)ctrl1form1Form2me.parentform.ctrl1

4

2 回答 2

2

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

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

Dim form as Form1

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

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

MessageBox.Show(form.TextBox1.Name)

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

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

结论

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

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

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

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

Dim btn As Label = Ctype(Form1.Controls("GroupBox1").Controls("Label1"), Label)
于 2013-04-03T07:36:39.817 回答