繁体   English   中英

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

[英]An object reference is required for the non-static field, method or property error

我正在开发C#Windows窗体应用程序,并且在主窗体上有一个TabControl。 在Form1.Designer.cs文件中声明它,如下所示:

public System.Windows.Forms.TabControl logFileCollectorTabControl;

在我项目的另一个类文件中,我想按以下方式使用此TabControl:

 logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage);

但是我收到错误消息“非静态字段,方法或属性错误需要对象引用”。 所以我的问题是,必须在某个地方声明一个Form类的对象,因为在启动应用程序时会启动该窗体,因此,如何确定其含义或如何解决此问题,我们将不胜感激!

通常可以通过将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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM