Как обновить элемент управления в родительской форме MDI из дочерних форм? - PullRequest
1 голос
/ 02 ноября 2011

Я посмотрел на несколько похожих вопросов, но на самом деле не получил ответа, поэтому я спрашиваю еще раз, надеюсь, кто-то может объяснить это.

Ситуация:

У меня есть форма MDI, котораяесть меню и строка состояния и тому подобное.Является ли единственный способ изменить текст для строки состояния и сделать что-то другое для родительской формы, это назвать ее static?Или, если нет, не могли бы вы привести пример обновления (например) строки состояния, которая существует в родительской форме в дочерних формах?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 02 ноября 2011

Класс Form уже предоставляет свойство MdiParent , гарантирующее, что свойство родительских форм IsMdiContainer установлено соответственно.

3 голосов
/ 02 ноября 2011

Вы должны заставить дочерние формы принимать экземпляр родительской формы в качестве параметра конструктора.
Дети могут сохранить этот параметр в закрытом поле, а затем по желанию взаимодействовать с родителем.

Для оптимального проектирования вы должны абстрагировать родителя от потомка через интерфейс, реализованный родителем, содержащий методы и свойства, которые делают то, что нужно потомкам. Затем дети должны взаимодействовать только с этим интерфейсом.

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

}
2 голосов
/ 02 ноября 2011

Другой вариант - использовать события (вы можете встроить эти события в базовый класс и позволить всем своим дочерним формам наследовать его):

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