代码之家  ›  专栏  ›  技术社区  ›  sharkin

.NET-获取窗体上控件引用的正确方法

  •  4
  • sharkin  · 技术社区  · 15 年前

    我有一个C类库,它使用一个表单(也在库中)。假设我在这个表单上有一个编辑框,叫做 编辑内容 .在常规表单应用程序中,我习惯于获取这样的编辑框:

    class MainForm
    {
         void Method()
         {
              this.editContents.Text = "Hi";
         }
    }
    

    我猜在常规表单应用程序的幕后会发生一些神奇的事情,因为编辑框成员在主窗体类中是私有的,但是我仍然可以像公共成员一样访问它。

    但是在我的类库中,我不能像这样访问编辑框。我这样“手动”实例化并显示表单:

    form = new MyForm();
    form.Show();
    

    我该怎么办 适当地 获得 编辑内容 此窗体的控件?

    7 回复  |  直到 15 年前
        1
  •  14
  •   Donut    15 年前

    你可以让它成为公开的 Property ,通过添加如下代码:

    public String EditContents // for just the "Text" field
    {
       get { return this.editContents.Text; }
       set { this.editContents.Text = value; }
    }
    

    或:

    public TextBox EditContents // if you want to access all of the TextBox
    {
       get { return this.editContents; }
       set { this.editContents = value; }
    }
    
        2
  •  5
  •   Julien Lebosquain    15 年前

    “magic”是为*.designer.cs文件中的文本框生成一个字段。默认情况下,此字段是私有的。如果要更改其可访问性,请在表单设计器中选择文本框,然后将“Modifiers”属性更改为“Public”。

    然而,公开表单的所有控件可能不是一个好主意。你可以把它包在一个像甜甜圈建议的更干净的地方。

        3
  •  2
  •   manji    15 年前

    私有成员可以在其声明类中访问。这就是为什么您能够从主窗体中访问editContents。
    从声明类之外无法访问私有成员。
    (这是对 private ,没有魔法)

    您可以将其包装在公共属性中:

    public TextBox EditContents
    {
       get { return this.editContents; }
    }
    
        4
  •  1
  •   shahkalpesh    15 年前

    首先,您可以访问 editContents 因为你在表格的范围内。

    正如@donut所说,您可以公开一个属性,供库中的用户使用该控件。如果您想限制访问,可以编写一个方法来代替。

    例如

    void SetContentForEditor(string text)
    {
       editContent.Text = text;
    }
    

    然后,你可以打电话给 SetContentForEditor
    例如

    myForm.SetContentForEditor("hello world");
    
        5
  •  0
  •   Robban    15 年前

    您可以通过Controls集合获取它。

    form.Controls.Find("nameOfControl", true);
    
        6
  •  0
  •   Joel Coehoorn    15 年前

    访问内部窗体成员时的差异 Method() 功能vs通过 form 最后一段代码中的引用是 方法() 函数是窗体类的成员,因此允许访问该类的其他私有成员。

        7
  •  0
  •   Scoregraphic    15 年前

    我将在库中引入一个事件,当文本发生更改时,该事件通知所有订阅服务器,并应在表单中进行设置。表单应附加到此事件并自行设置文本框内容。