如何从子窗体更新MDI父窗体中的控件?
问题描述:
我看了一些类似的问题,但我没有真正得到我的答案,所以我再次问希望有人能解释它。如何从子窗体更新MDI父窗体中的控件?
的情况:
我有,有一些menues和状态栏之类的东西,一个MDI形式。更改状态栏的文本并对父窗体执行其他操作的唯一方法是将其称为static
?或者,如果没有,请给出一个例子来更新(例如)父表单中存在的父表单中的状态栏?
谢谢!
答
另一种选择是使用事件(你可以建立这些事件到一个基类,让你的所有子窗体继承它):
// 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);
}
}
}
答
您需要让子窗体将父窗体实例作为构造函数参数。
孩子们可以将此参数保存到专用字段,然后稍后与父母进行交互。
为了优化设计,您应该通过由父级实现的接口从子级抽取父级,其中包含执行子级需要的方法和属性。那么孩子们只能与这个界面进行交互。
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;
}
}
你能举的例子吗?你的意思是像父窗体中那样instantisize就像'ChildForm child = new ChildForm(this)',并且在'ChildForm'构造函数中像'ChildForm(Form parent)'一样做! –
确切地说,除了子窗体应该带有“ParentForm”类型的参数(或者更好的是,'IChildHost'),而不是'Form'。 – SLaks
对不起,但我想我需要看到一些代码来理解这个好:(你会介意一些代码吗? –