访问其他.cs文件中的主表单对象

从主文件访问子窗口的对象很容易,因为我们必须创建子窗口。 所以有这样的事情:

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

但是我通过子cs文件编辑combobox(放置在主窗体内)时遇到了一些麻烦。 我不能简单地创建一个新的主窗口。 我编辑了Program.cs文件:

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

现在我可以访问combobox:

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

这是更好的解决方案吗?

您还可以将对mainform的引用直接传递到子表单中,至少您的主表单将无法用于整个应用程序:

MainWindow.cs:

 SubForm subform = new SubForm(this); 

SubForm.cs:

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

所以现在你可以像mainForm.comboCurves.Items.Add(“test”)那样访问它;


另外,更好的方法是让主表单inheritance形成一个只暴露必要内容的接口:

 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更改为文本框数组,则第二种forms甚至不会注意到它。


您的解决方案可行,但您应始终尝试从SOLID原则中公开最少量的信息,这些信息部分由接口隔离原则涵盖。