无法访问类中的Winforms控件

时间:2009-04-08 07:16:43

标签: c# winforms

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

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

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

感谢某人是否可以了解为何会发生这种情况。

由于

4 个答案:

答案 0 :(得分:4)

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

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

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

这提供了各种优势:

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:3)

Form1中的控件将是私有的

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

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

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

答案 3 :(得分:0)

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

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