在Windows窗体中访问另一个窗体上的控件的最佳方法?

Dyl*_*ett 47 c# controls winforms

首先,这是一个关于使用Windows窗体的桌面应用程序的问题,而不是ASP.NET问题.

我需要与其他表单上的控件进行交互.我试图通过使用,例如,以下来访问控件...

otherForm.Controls["nameOfControl"].Visible = false;
Run Code Online (Sandbox Code Playgroud)

它不像我期望的那样工作.我最终抛出了一个例外Main.但是,如果我public而不是制作控件private,我可以直接访问它们,因为......

otherForm.nameOfControl.Visible = false;
Run Code Online (Sandbox Code Playgroud)

但这是最好的方法吗?是否public将其他形式的控件视为"最佳实践"?是否有"更好"的方式访问另一种形式的控件?

进一步说明:

这实际上是我提出的另一个问题的后续问题,在C#中创建"树视图首选项对话框"类型的界面的最佳方法?.我得到的答案非常好,解决了许多很多组织问题,这些问题在保持用户界面简单易用的同时兼顾了运行时和设计时.然而,它确实提出了一个轻松控制界面其他方面的问题.

基本上,我有一个根表单,它实例化了根表单中面板中的许多其他表单.因此,例如,其中一个子表单上的单选按钮可能需要更改主,根表单上的状态条图标的状态.在这种情况下,我需要子表单与父(根)表单的状态条中的控件进行通信.(我希望这是有道理的,而不是在"谁是第一个"的方式.)

Jon*_*jap 37

您可以创建一个控制其可见性的属性,而不是将控件公开:

public bool ControlIsVisible
{
     get { return control.Visible; }
     set { control.Visible = value; }
}
Run Code Online (Sandbox Code Playgroud)

这将为该控件创建一个合适的访问器,不会公开控件的整个属性集.


Rob*_*per 20

我个人会建议要这样做......如果它正在响应某种行为并且需要改变它的外观,我宁愿提出一个事件并让它自行解决......

形式之间的这种耦合总是让我感到紧张.我总是尽量保持用户界面尽可能轻松独立.

我希望这有帮助.也许你可以扩展这个场景,如果没有?


Bir*_*iri 8

第一个当然不起作用.表单上的控件是私有的,仅在设计时可见.

让它全部公开也不是最好的方式.

如果我想向外界揭示某些东西(也可能意味着另一种形式),我会为它制作一个公共财产.

public Boolean nameOfControlVisible
{
    get { return this.nameOfControl.Visible; }
    set { this.nameOfControl.Visible = value; }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用此公共属性隐藏或显示控件或询问控件当前可见性属性:

otherForm.nameOfControlVisible = true;
Run Code Online (Sandbox Code Playgroud)

您还可以公开完整控件,但我认为它太多了,您应该只在当前表单之外显示您真正想要使用的属性.

public ControlType nameOfControlP
{
    get { return this.nameOfControl; }
    set { this.nameOfControl = value; }
}
Run Code Online (Sandbox Code Playgroud)


Bir*_*iri 5

在阅读了其他详细信息后,我同意robcthegeek:举办活动.创建自定义EventArgs并通过它传递必要的参数.