从主文件访问子窗口的对象很容易,因为我们必须创建子窗口。所以有这样的事情:
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 :(得分:4)
您还可以将对主窗体的引用直接传递到子窗体中,至少您的主窗体将无法用于整个应用程序:
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”)那样访问它;
另外,更好的方法是让主表单继承形成一个只暴露必要内容的接口:
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更改为文本框数组,则第二种形式甚至不会注意到它。
您的解决方案有效,但您应始终尝试从SOLID原则中公开最少量的信息,这些信息部分由Interface segregation principle涵盖。