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

时间:2013-12-10 21:18:18

标签: c# object

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

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");

对此更好的解决方案吗?

1 个答案:

答案 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涵盖。