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

时间:2011-11-02 16:21:46

标签: c# tabs windows-forms-designer

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

public System.Windows.Forms.TabControl logFileCollectorTabControl;

在我项目的另一个类文件中,我想使用此TabControl,如下所示:

 logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage);

但我收到错误'非静态字段,方法或属性错误需要对象引用'。所以我的问题是,必须有一个Form类的对象在某处声明,因为当我启动应用程序时窗体会启动,所以如何找出它是什么,或者如何解决这个问题,非常感谢任何帮助!

4 个答案:

答案 0 :(得分:1)

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

//somewhere in Form1
OtherClass other = new OtherClass (this);

// OtherClass.cs
class OtherClass {
    Form1 _opener;

    public OtherClass(Form1 opener) {
        _opener = opener;
    }
}

答案 1 :(得分:1)

您的其他班级是否了解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);
    }
}

答案 2 :(得分:1)

可能无需传递整个表单的实例,您只能将引用传递给TabControl。但在我看来,这仍然是糟糕的设计。您的逻辑应该与UI分开。如果你的类执行一些计算,数据库操作或者不执行某些操作,它根本不应该“知道”你的窗口,因为这是不灵活的。实现一个事件。

答案 3 :(得分:0)

另一个选择是在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);
    }
}