【问题标题】:Access to the elements of parent form from child in MDI从 MDI 中的子级访问父级表单的元素
【发布时间】:2010-10-02 19:29:03
【问题描述】:

问题是我需要从其他表单访问不同的表单元素,或者例如从一些子窗口访问 MdiContainer 表单菜单并对其进行一些操作。如何正确实现这样的功能?我现在使用的是 Windows 窗体。

下面的一些示例代码来演示我是如何尝试这样做的。

Form1(是一个 Mdi 容器)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void menu2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form2 chWin = new Form2(this);
        chWin.Show();
    }

    public void disableMenu()
    {
        menuStrip1.Enabled = false;
    }
}

Form2(是 Form1 的子级)

public partial class Form2 : Form
{
    private Form1 parent;

    public Form2(Form1 parent)
    {
        InitializeComponent();
        MdiParent = parent;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        parent.disableMenu();
    }
}

还有一个例外: 对象引用未设置为对象的实例

尝试用谷歌搜索,但实际上对我的场合没有任何帮助。

提前致谢!

【问题讨论】:

    标签: c#


    【解决方案1】:

    您正在尝试访问尚未初始化的成员。在 Form2 构造函数中,您只是设置了 MdiParent 属性,但您忘记了这一行:

    this.parent = parent;
    

    此外,您不必将 Form1 传递给 Form2 的构造函数。您可以通过在显示 Form2 之前设置 MdiParent 来避免这种情况:

    private void menu2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form2 chWin = new Form2(this);
        chWin.MdiParent = this;
        chWin.Show();
    }
    

    然后在 Form2 中,您可以通过将 MdiParent 转换为 Form1 来调用 Form1 的方法:

    private void button1_Click(object sender, EventArgs e)
    {
        ((Form1)MdiParent).disableMenu();
    }
    

    虽然您可能应该先创建一个界面,而不是这样做:

    public interface IMenuHandler
    {
        void DisableMenu();
    }
    

    然后让Form1实现这个接口,并在其构造函数中传递给Form2。 Form2 的整个实现将如下所示:

    public partial class Form2 : Form
    {
        private IMenuHandler menuHandler;
    
        public Form2(IMenuHandler handler)
        {
            InitializeComponent();
            this.menuHandler = handler;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            menuHandler.DisableMenu();
        }
    }
    

    这样您的 Form2 不会直接依赖于 Form1,您可以更轻松地更改任何一个表单。

    【讨论】:

    • 界面上的有趣想法。干净简洁
    【解决方案2】:

    你也可以像这样获取父表单方法:

    ((MyClass)ParentForm).foo();
    

    来自您的子表单方法

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 1970-01-01
      • 2019-01-27
      • 2013-08-27
      • 2014-07-13
      • 2015-04-23
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      相关资源
      最近更新 更多