我看了一些类似的问题,但我没有真正得到答案,所以我再次问,希望有人可以解释。
情况:
我有一个MDI表单,有一些菜单和一个状态栏和类似的东西。更改状态栏文本和对父表单执行其他操作的唯一方法是将其称为static
吗?或者,如果没有,您能否举例说明更新(例如)子表单中父表单中存在的状态栏?
谢谢!
答案 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);
}
}
}