如何从子窗体更新MDI父窗体中的控件

本文关键字:窗体 控件 MDI 更新 | 更新日期: 2023-09-27 18:13:00

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

这句话的语境是:

我有一个MDI表单有一些菜单和状态栏之类的东西。改变文本的状态栏和做其他事情的父窗体的唯一方法是将其称为static ?或者如果没有,你能给一个例子来更新(例如)存在于父窗体中的子窗体状态栏?

谢谢!

如何从子窗体更新MDI父窗体中的控件

你需要让子窗体接受父窗体实例作为构造函数参数。
子节点可以将此参数保存到一个私有字段中,然后再随意与父节点交互。

为了获得最佳设计,您应该通过由父类实现的接口将父类从子类抽象出来,其中包含执行子类所需的方法和属性。子接口只能与这个接口交互。

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;
    }
}

Form类已经公开了一个属性MdiParent,确保父窗体的IsMdiContainer属性被相应地设置

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

// 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);
        }
    }
}