2013-12-10 39 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

相关问题