非静态字段、方法或属性错误需要对象引用

本文关键字:错误 对象引用 属性 静态 字段 方法 | 更新日期: 2023-09-27 18:13:32

我正在开发一个c# windows窗体应用程序,在主窗体上我有一个TabControl。它在form . designer .cs文件中声明如下:

public System.Windows.Forms.TabControl logFileCollectorTabControl;

在我的项目中的另一个类文件中,我想这样使用这个TabControl:

 logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage);

但是我得到错误'一个对象引用是非静态字段,方法或属性错误的要求'。所以我的问题是,必须有一个窗体类的对象声明在某个地方,因为表单启动时,我启动应用程序,所以我怎么知道那是什么,或者我怎么能解决这个问题,任何帮助是非常感谢!

非静态字段、方法或属性错误需要对象引用

通常通过将Form1的实例传递给调用类的构造函数来克服这个问题,然后将其保存在一个字段中,直到需要时。

//somewhere in Form1
OtherClass other = new OtherClass (this);
// OtherClass.cs
class OtherClass {
    Form1 _opener;
    public OtherClass(Form1 opener) {
        _opener = opener;
    }
}

您的其他类是否知道logFileCollectorForm?

如果你不把表单的引用传递给其他类,那么其他类就不知道logFileCollectorForm引用的是什么。

//example of another class
class AnotherClass
{
    Form1 logFileCollectorForm;
    public AnotherClass(Form1 logFileCollectorForm)
    {
        this.logFileCollectorForm = logFileCollectorForm;
    }

    public DoSomething(String newTabPage)
    {
        logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage);
    }
}

可能不需要传递整个表单的实例,您可以只传递对TabControl的引用。但在我看来,这仍然是糟糕的设计。您的逻辑应该与UI分离。如果您的类执行一些计算、数据库操作或诸如此类的操作,那么它根本不应该真正"知道"您的窗口,因为这是不灵活的。实现一个事件。

另一种选择是在Program类中保持对主表单的静态引用。

static class Program
{
    internal static Form1 MainForm { get; set; } 
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainForm = new Form1();
        Application.Run(MainForm);
    }
}
class OtherClass
{
    public void AddNewTab(TabPage newTabPage)
    {
        Program.MainForm.logFileCollectorTabControl.TabPages.Add(newTabPage);
    }
}