我在运行时期间创建了一些controls
,如下所示:
pnl1.Controls.Add(New TextBox() With _
{
.Name = "ItemName", _
.Anchor = AnchorStyles.Left + AnchorStyles.Right _
}
我尝试将其修饰符设置为Public
。不幸的是,我的所有尝试都失败了
我的问题是:我们可以为动态创建的控件设置修改器吗?
如果没有,那么我如何访问其他controls
中的forms
? (例如 Form1
动态创建控件ctrl1
,Form2
存在于MDI container
的{{1}}内。
如何从Form1
访问ctrl1
? (未在Form2
中为public
设置ctrl1
修饰符,我们无法从此form1
Form2
访问me.parentform.ctrl1
答案 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 :(得分: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)