如何从子表单更新MDI父表单中的控件?

时间:2011-11-02 12:45:46

标签: c# winforms events mdi

我看了一些类似的问题,但我没有真正得到答案,所以我再次问,希望有人可以解释。

情况:

我有一个MDI表单,有一些菜单和一个状态栏和类似的东西。更改状态栏文本和对父表单执行其他操作的唯一方法是将其称为static吗?或者,如果没有,您能否举例说明更新(例如)子表单中父表单中存在的状态栏?

谢谢!

3 个答案:

答案 0 :(得分:3)

您需要使子表单将父表单实例作为构造函数参数 孩子们可以将此参数保存到私有字段,然后稍后与父母进行交互。

为了优化设计,您应该通过父项实现的接口从子项中抽象父项,其中包含执行子项所需的方法和属性。然后孩子们只应该与这个界面互动。

public interface IChildHost {
    void UpdateStatusBar(string status);
    //Other methods & properties
}

public partial class ParentForm : IChildHost {
    public void UpdateStatusBar(string status) {
        ...
    }
    //Implement other methods & properties
}

public partial class ChildForm {
    readonly IChildHost host;
    public ChildForm(IChildHost parent) {
        this.host = parent;
    }

}

答案 1 :(得分:3)

Form类已公开属性MdiParent,确保相应地设置父表单IsMdiContainer属性。

答案 2 :(得分:2)

另一个选择是使用事件(您可以将这些事件构建到基类中,并让所有子表单继承自它):

// Code from Form 1
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2();
        objForm2.ChangeStatus += new ChangeStatusHandler(objForm2_ChangeStatus);
        objForm2.Show();
    }
    public void objForm2_ChangeStatus(string strValue)
    {
        statusbar.Text = strValue;
    }
}

// Code From Form 2
public delegate void ChangeStatusHandler(string strValue);
public partial class Form2 : Form
{
    public event ChangeStatusHandler ChangeStatus;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (PassValue != null)
        {
            PassValue(textBox1.Text);
        }
    }
}