如何从子窗体更新MDI父窗体中的控件
本文关键字:窗体 控件 MDI 更新 | 更新日期: 2023-09-27 18:13:00
我看了一些类似的问题,但我没有真正得到我的答案,所以我再问一次,希望有人能解释一下。
这句话的语境是:
我有一个MDI表单有一些菜单和状态栏之类的东西。改变文本的状态栏和做其他事情的父窗体的唯一方法是将其称为static
?或者如果没有,你能给一个例子来更新(例如)存在于父窗体中的子窗体状态栏?
谢谢!
你需要让子窗体接受父窗体实例作为构造函数参数。
子节点可以将此参数保存到一个私有字段中,然后再随意与父节点交互。
为了获得最佳设计,您应该通过由父类实现的接口将父类从子类抽象出来,其中包含执行子类所需的方法和属性。子接口只能与这个接口交互。
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);
}
}
}