2011-11-02 100 views
0

我正在開發一個C#窗體窗體應用程序,並在主窗體上有一個TabControl。它是在Form1.designer.cs文件中聲明如下:非靜態字段,方法或屬性錯誤需要對象引用

public System.Windows.Forms.TabControl logFileCollectorTabControl; 

在我的項目中另一個類文件,我想按如下方式使用此TabControl的:

logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage); 

但我得到的錯誤「非靜態字段,方法或屬性錯誤'需要對象引用。所以我的問題是,必須有一個Form類的對象聲明在某處,因爲當我啓動應用程序時表單會啓動,所以我怎麼知道這是什麼,或者我該如何解決這個問題,非常感謝任何幫助!

+0

沒有關於您正在嘗試做什麼的更多信息,我認爲當前的答案是解決此錯誤的好建議。 –

回答

1

這通常是通過將Form1的實例傳遞給調用類的構造函數,然後將其保留在字段中直到需要。

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

// OtherClass.cs 
class OtherClass { 
    Form1 _opener; 

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

非常感謝,萬事如意! – DukeOfMarmalade

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); 
    } 
} 
1

大概沒有需要通過整個表單的一個實例,你可以通過一個僅參考您的TabControl。但在我看來,這仍然是糟糕的設計。你的邏輯應該與用戶界面分開。如果你的類執行了一些計算,數據庫操作或者什麼不是,那麼它根本不需要「知道」你的窗口,因爲這是不靈活的。改爲實施一個活動。

0

另一種方法是在類中保留對主窗體的靜態引用。

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); 
    } 
} 
相關問題