2013-12-10 35 views
4

從主文件訪問子窗口的對象很容易,因爲我們必須創建子窗口。因此,有這樣的事情:在其他.cs文件中訪問主窗體對象

SubForm subform = new SubForm(); 
if (subform.ShowDialog() == DialogResult.OK) 
{ 
    text = subform.textBox1.Text; 
    //... 
} 

但我有一些麻煩與子CS文件編輯組合框(位於主窗口中)。我不能簡單地創建一個新的主窗口。我已經編輯的Program.cs文件:

static class Program 
    { 
     public static MainForm mainform; //main window reference 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(mainform = new MainForm()); 
     } 
    } 

現在我可以訪問該組合框:

Program.mainform.comboCurves.Items.Add("test"); 

是不是這方面的任何更好的解決方案?

+0

當然:在組合和想要影響它的代碼之間插入一個(或多個)適當的抽象層。這實在太開放以提出具體的建議。 – Jon

+0

通常這是http://codereview.stackexchange.com/的問題。但是創建表單的靜態變量並不是一個很好的模式。爲什麼'sub-cs'文件要創建組合框項目? –

+0

可能重複的[如何在另一個窗體中調用mainform方法在用戶控件C#](http://stackoverflow.com/questions/17672276/how-to-call-mainform-method-in-another-form-in-usercontrol- c-sharp) – mbeckish

回答

4

您也可以傳給你的MainForm參考直接進入你的窗體,至少你的主要形式,將不會提供給你的整個應用程序:

MainWindow.cs:

SubForm subform = new SubForm(this); 

子窗體。 CS:

public partial class SubForm : Form 
{ 
    private MainForm mainForm; 
    public SubForm(MainForm mainForm) 
    { 
     InitializeComponent(); 
     this.mainForm = mainForm; 
    } 
} 

所以現在你可以像mainForm.comboCurves.Items.Add( 「測試」)進行訪問;


此外,更好的辦法是將有你的主要形式繼承形成僅暴露必要的東西接口:

public partial class MainForm : Form, IRestrictedInterfaceOfMainForm 
{ 
    public void AddStuff(string stuff) 
    { 
     comboCurves.Items.Add(stuff); 
    } 
} 

public interface IRestrictedInterfaceOfMainForm 
{ 
    void AddStuff(); 
} 

public partial class SubForm : Form 
{ 
    private IRestrictedInterfaceOfMainFormmainForm mainForm; 
    public SubForm(IRestrictedInterfaceOfMainFormmainForm mainForm) 
    { 
     InitializeComponent(); 
     this.mainForm = mainForm; 
    } 
} 

這樣,你只能訪問你真正需要的和不直接與MainForm的控件一起玩。例如,如果你想將comboCurves改爲一個文本框數組,第二個表單甚至不會注意到它。


你的解決方案的工作,但你應該總是試圖揭露信息的最低量,這部分是由Interface segregation principle覆蓋,從SOLID原則。

+0

我認爲第二個例子更優雅,這將允許傳遞的對象是任何類型(至少IRestrictedInterfaceOfMainForm),而不是MainForm。 –

+0

我喜歡第一個選項,對我來說更簡單(不知道接口)。我剛剛測試過,而且我很滿意。謝謝! – mopsiok

相關問題