2011-11-02 190 views
1

我看了一些类似的问题,但我没有真正得到我的答案,所以我再次问希望有人能解释它。如何从子窗体更新MDI父窗体中的控件?

的情况:

我有,有一些menues和状态栏之类的东西,一个MDI形式。更改状态栏的文本并对父窗体执行其他操作的唯一方法是将其称为static?或者,如果没有,请给出一个例子来更新(例如)父表单中存在的父表单中的状态栏?

谢谢!

回答

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

} 
+0

你能举的例子吗?你的意思是像父窗体中那样instantisize就像'ChildForm child = new ChildForm(this)',并且在'ChildForm'构造函数中像'ChildForm(Form parent)'一样做! –

+0

确切地说,除了子窗体应该带有“ParentForm”类型的参数(或者更好的是,'IChildHost'),而不是'Form'。 – SLaks

+0

对不起,但我想我需要看到一些代码来理解这个好:(你会介意一些代码吗? –

相关问题