2013-04-03 166 views
0

运行期间我一直在创造一些controls像下面设置修饰符:动态创建的控件

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

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

如果不是,那么我怎样才能访问其他forms中的那些controls? (例如:Form1具有动态创建的控件ctrl1,Form2,其存在于Form1MDI container内)。

如何从Form2访问ctrl1? (没有form1设置public改良剂ctrl1我们无法从Form2访问它像这样me.parentform.ctrl1

回答

1

当不dinamically,该控件Friend With Events,在Vb.NET,宣布将它们添加到之前在Visual Studio套默认形成。你可以做同样的事情,申报一个公共List(Of Control)(例如),并在你创建它们时添加你的控件。

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

或者您可以从窗体中获取它们。使用Form1.Controls,您可以访问表单中的所有控件。如果你的控制是另一个控制里面,你需要达到的控制是控制内,例如:

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

+1 Nice Solution。我会试试这个,让你知道这是否有效。 –

+0

哎呀抱歉,忘记接受它作为我的答案。我一直在使用你的想法。你建议我使用公共列表(控制),但我稍微修改它。我所做的是在运行期间,我将我的控件添加到面板中,该面板具有修改器作为公共。不管怎样,谢谢。 –

2

你缺少,该访问修饰符在那里时在编译时描述窗体类,不运行。访问修饰符不是一种安全机制!

例如,将3 TextBox es添加到表单中。给他们访问修饰符Private,现在创建窗体的实例,并运行下面的代码:

Dim form as Form1 

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

您将获得3点MessageBox上课,告诉你3个TextBox ES的名字,即使他们的访问修饰符Private。到Public不同的是,你不能写这样的代码:

MessageBox.Show(form.TextBox1.Name) 

您不能访问私有成员这样一类的。但是,编译时可以使用成员。他们和班级一起申报。在这种情况下,它们简化了对Control的访问。

在运行期间向表单添加控件将而不是在类中创建一个新成员!它不能,因为你的类将不得不被修改,重新编译,重新生成等等。

结论

  1. 声明你的会员Private并不妨碍对象访问控制他们 封装。
  2. 在运行时创建控件不会影响类。
  3. 您正在寻找设计模式,如MVCMVVM
+0

+1谢谢一些很好的建议。 –