Как обновить элемент управления в родительской форме MDI из дочерних форм?

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

Ситуация:

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

Спасибо!


person Saeid Yazdani    schedule 02.11.2011    source источник


Ответы (3)


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

// 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);
        }
    }
}
person Veldmuis    schedule 02.11.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;
    }

}
person SLaks    schedule 02.11.2011
comment
Можете ли вы привести пример? Вы имеете в виду, как в родительской форме создать экземпляр, например ChildForm child = new ChildForm(this), а в конструкторе ChildForm сделать как ChildForm(Form parent) ?! - person Saeid Yazdani; 02.11.2011
comment
Именно так, за исключением того, что дочерние формы должны принимать параметр типа ParentForm (или, еще лучше, IChildHost), а не Form. - person SLaks; 02.11.2011
comment
извините, но я думаю, что мне нужно увидеть код, чтобы хорошо это понять :( не могли бы вы возражать против некоторых кодов, пожалуйста? - person Saeid Yazdani; 02.11.2011
comment
@SLaks: Разве это уже не связано с концепцией MDIParent? Если он использует базовый класс для своих форм (управляемый интерфейсом, как вы предлагаете), он должен иметь возможность взаимодействовать в обоих направлениях. - person Joel Etherton; 02.11.2011
comment
@JoelEtherton: Да, но это больше связано. Моя версия позволяет использовать детей без MDI, используя другой IChildHost. - person SLaks; 02.11.2011
comment
@Slaks: Хорошо, я это вижу. Если нет намерения использовать форму за пределами отношения MDI, имеет ли этот метод какие-либо преимущества по сравнению с более строгой связью? - person Joel Etherton; 02.11.2011
comment
@Slaks: Задавая вопрос в моем комментарии, я не возражаю против вашего ответа, меня действительно интересуют любые потенциальные преимущества для любого из них. - person Joel Etherton; 02.11.2011
comment
Это упрощает создание дочерней формы, но создает скрытую зависимость от MdiParent. - person SLaks; 02.11.2011

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

person Lloyd    schedule 02.11.2011