首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为动态创建的控件设置修饰符

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

Stack Overflow用户
提问于 2013-04-03 07:16:49
回答 2查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
pnl1.Controls.Add(New TextBox() With _
{
    .Name = "ItemName", _
    .Anchor = AnchorStyles.Left + AnchorStyles.Right _
}

我试图将它的修饰符设置为Public。不幸的是,我所有的尝试都失败了。

我的问题是:我们可以为动态创建的控件设置修饰符吗?

如果不是,那么我如何访问其他forms中的呢?(Ex: Form1动态创建了控制ctrl1Form2存在于MDI container of Form1中)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-03 07:36:39

如果不是直接设置,Visual默认将控件设置为Friend With Events,在Vb.NET中,在添加到窗体之前声明这些控件。您也可以这样做,声明一个公共List(Of Control) (例如),并在创建控件时添加控件。

或者更好的是,一个Dictionary(Of String, Control)以它的名字访问控件。

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

代码语言:javascript
复制
Dim btn As Label = Ctype(Form1.Controls("GroupBox1").Controls("Label1"), Label)
票数 1
EN

Stack Overflow用户

发布于 2013-04-03 07:37:22

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

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

代码语言:javascript
复制
Dim form as Form1

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

您将得到3个MessageBoxes,告诉您3 TextBoxes的名称,即使它们的访问修饰符是Private。与Public不同的是,您不能编写这样的代码:

代码语言:javascript
复制
MessageBox.Show(form.TextBox1.Name)

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

在运行时向表单添加控件将使而不是在类中创建一个新成员!它不能,因为您的类必须被修改、重新编译、恢复,等等。

结论

  1. 声明成员Private并不阻止对象访问它们封装的控件。
  2. 在运行时创建控件不影响类。
  3. 您可能正在寻找像MVCMVVM这样的设计模式。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15781105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档