Мероприятия в MDIParents Forms and Childs - PullRequest
1 голос
/ 19 июня 2009

Как я могу обрабатывать события MDIParent Form в дочерних формах? например, в родительской форме у меня есть опция «поиск по дочерней сетке», и когда эта кнопка нажата, в дочерней форме фокусируется одна строка в сетке.

Я использую C # 3.5 Windows Forms Application

Заранее спасибо

Ответы [ 5 ]

5 голосов
/ 20 июля 2009

Я вижу два разных способа решения этой проблемы.

Если вы могли бы подумать о размещении команды в MenuStrip вместо этого, и это та же самая дочерняя форма, которая существует в нескольких случаях в приложении MDI, вы можете добавить команду (и) MenuStrip элемент управления в дочерней форме. Эти команды меню будут автоматически объединены с командами в родительской форме, но любые события щелчка будут выполняться в активной дочерней форме.

Вы можете контролировать, где и как команды меню из дочерней формы объединяются с командами в родительской форме через свойства MergeAction и MergeIndex. При использовании этого подхода вам, вероятно, следует установить для свойства Visible MenuStrip в дочерней форме значение false, чтобы оно не занимало ненужного места в форме.

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

Упрощенный пример кода второго подхода:

interface IGridSearch
{
    void PerformSearch(string criteria);
}

public partial class MdiChildUI : Form, IGridSearch
{
    public MdiChildUI()
    {
        InitializeComponent();
    }

    public void PerformSearch(string criteria)
    {
        // peform the search
    }        
}

public partial class MdiParentUI : Form
{
    public MdiParentUI()
    {
        InitializeComponent();
    }

    private void MdiParentUI_MdiChildActivate(object sender, EventArgs e)
    {
        SetControlStates();

    }

    private void SetControlStates()
    {
        _searchCommand.Enabled = (this.ActiveMdiChild is IGridSearch);
    }

    private void _searchCommand_Click(object sender, EventArgs e)
    {
        IGridSearch child = (this.ActiveMdiChild as IGridSearch);
        if (child != null)
        {
            child.PerformSearch("whatever to search for");
        }
        else
        {
            MessageBox.Show("Can't search in the active form");
        }
    }
}
1 голос
/ 20 июля 2009

В дочерней форме создайте новое событие для родительского вызова:

Friend Event search(ByVal token As String)

В родительской форме объявите экземпляр дочерней формы без событий:

Private WithEvents _FChild As frmChild

В родительской форме, если вы хотите вызвать дочернюю форму, укажите вашу объявленную переменную. Событие должно отображаться в intellisense:

Private Sub searchChild_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearchChild.Click
               _FChild.search(txtToken)
1 голос
/ 20 июля 2009

Это не так уж сложно:

public partial class Form1 : Form
{
    // other stuff...

    // e.g. some button's click event handler
    private void addChild_Click(object sender, EventArgs e)
    {
        Form2 child = new Form2();

        child.MdiParent = this;

        this.SomeEvent += child.SomeMethod();

        // other init stuff...
    }
}

Просто убедитесь, что подпись метода-обработчика в дочерних формах совпадает с подписью делегата-обработчика события родителя.

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

public static bool IsActiveMDIChild(this Form child)
{
    Form mdiParent = Form.ActiveForm;

    Form activeChild = mdiParent.ActiveMdiChild;

    return child == activeChild;
}

Затем добавьте такой код в обработчик SomeMethod ():

public bool SomeMethod(*/ signature here /*)
{
    if(!this.IsActiveMDIChild()) return;

    //do stuff normally, we're in the active child form
}
0 голосов
/ 19 июня 2009

Я делаю то же самое прямо сейчас, и вот как я это делаю:

  • Так как родитель вызывает событие, событие должно существовать в родительской форме
  • Во время кода на родительском элементе, который загружает дочерний элемент (у вас есть код где-то, где создается дочерняя форма), после того, как дочерняя форма существует, используйте AddHandler, чтобы привязать событие в родительском элементе MDI с открытым подпрограммой в дочерней форме
  • Когда родительская форма запускает событие, экземпляр дочерней формы будет обрабатывать его.

Имеет ли это смысл? Я использую VB.NET, поэтому язык может немного отличаться, но это общая техника, которую я использую.

0 голосов
/ 19 июня 2009

У вас есть код, чтобы мы могли быть более полезными?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...