【问题标题】:Unable to access Winforms control in a class无法访问类中的 Winforms 控件
【发布时间】:2010-10-18 05:59:13
【问题描述】:

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

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

然而,在自定义类中,智能感知根本不显示控件的名称。

如果有人能解释为什么会发生这种情况,请不胜感激。

谢谢

【问题讨论】:

  • 你的意思是你不能访问Form1类本身的控件,除非你创建一个函数?如果不在函数中,您将把该代码放在哪里?

标签: c# winforms


【解决方案1】:

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

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

对于更复杂的操作,最好使用方法;属性非常适合用于离散值的简单读/写。

这提供了各种优势:

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

【讨论】:

  • 我认为这里的问题是他没有对表单的引用。在这种情况下,添加属性将无济于事。除此之外,我完全同意不将控件公开
【解决方案2】:

您的班级需要对表单的引用才能使其正常工作。原因是表单不是静态类,因此您可以拥有它的多个实例。

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

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

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

【讨论】:

    【解决方案3】:

    Form1 中的控件将是私有的

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        • 1970-01-01
        相关资源
        最近更新 更多