无法访问类中的Winforms控件

我目前正在使用Visual Studio 2008在C#中的一个小窗口表单项目中工作。我已经为项目添加了一个自定义类,但是在这个类中我无法访问表单控件(如列表框,文本框,按钮)以便以编程方式更改其属性。

类文件包含system.windows.forms,所有文件都在同一名称空间中。 令人惊讶的是,我也无法访问form1类本身的控件,除非我在类中创建一个方法然后intellisense弹出各种控件的名称。

但是,在自定义类中,intellisense根本不显示控件的名称。

感谢是否有人可以了解为什么会发生这种情况。

谢谢

封装意味着你的单独的类应该直接与控件交谈。 相反,您应该在(外部) Control上公开属性和方法 – 例如:

 public string TitleText { get {return titleLbl.Text;} set {titleLbl.Text = value;} } 

对于更复杂的操作,最好使用一种方法; 对于谨慎的值,简单的读/写属性很好。

这提供了各种优点:

  • 如果需要,您可以将详细信息抽象到接口(或类似)
  • 您可以更改实现(例如,使用表单的文本作为标题)而无需更改调用代码
  • 它只是……更好;-p

您的类需要对表单的引用才能使用。 原因是表单不是静态类,因此您可以拥有多个实例。

给它引用的最好方法可能是在类构造函数中传递它。 然后该类将具有对该表单的引用,并可以使用该引用来更改控件。

如果您100%确定只打开表单的一个实例,则可以使用另一个选项:将公共静态属性添加到返回表单实例的表单类中。 然后该属性可用于您的其他类。

此外,请确保您的控件是公共的,或者更好地向表单添加可用于间接操作控件的公共方法。

Form1中的控件将是私有的

 partial class Form1 { //elided other good stuff private System.Windows.Forms.Button button1; } 

所以不,你不能直接从另一个类访问它。

你可以像@abatishchev建议的那样公开它(但这是一个非常糟糕的主意)。 更好的计划是使用@Marc Gravell建议的属性。 您仍然需要将对表单的引用传递给您希望使用该属性的类(如@Rune Grimstad所指出的那样)。 您正在尝试在应用程序中编写一个直接向UI请求数据的类。 这通常不被认为是一个非常好的主意。 class级应该完全关注它自己的目的。 您应该为类需要访问的特定数据位设计属性或事件,而不必将整个表单传递给它,可能只是需要处理或更改的值。

看看如何使用MVP模式实现这一点(示例代码): 使用Windows窗体实现MVC

更新:您提到的类中的代码实际上应该是表单的演示者的一部分,该演示者具有对表单的引用(通过IView接口)。 这就是你应该如何设计你的UI代码,而不是直接访问其他Form的私有部分。