Как обнаружить вызов методов из другой формы? - PullRequest
0 голосов
/ 30 января 2012

У меня есть приложение winform с именем myForm.В этой форме я открываю другую форму:

    private OtherForm otherForm; //this is a field

    private OpenOtherForm()
    {
       if (otherForm == null)
       {
          otherForm = new OtherForm();
          otherForm.FormClosing += delegate { MessageBox.Show("OtherForm will be closed"); otherForm = null};
       }

       MessageBox.Show("Form is already active!");
    }

Это прекрасно работает.Но у меня есть несколько методов и во втором классе.Я хотел бы попытаться захватить их звонок.

Например, если во второй форме вызывается OtherForm.DoSomething (), я хочу, чтобы окно сообщения показывало это.

Я пытался назначить OtherForm.DoSomething() += delegate { /* mesagebox */}; Но это не компилируется

Ответы [ 2 ]

5 голосов
/ 30 января 2012

otherForm.FormClosing += delegate { .. } компилируется, потому что FormClosing имеет тип Event. На событие можно подписаться, и при его запуске ваш код будет запущен.

Вы не можете использовать этот синтаксис для метода, подобного DoSomething(). Метод может быть вызван только с чем-то вроде otherForm.DoSomething(). Код в DoSomething() будет выполнен.

Однако вы можете создать собственное событие и запустить его при выполнении DoSomething () во второй форме.

Вот документация MSDN о публикации собственного события.

Это было бы что-то вроде:

public event EventHandler RaiseCustomEvent;

public void DoSomething()
{
    OnRaiseCustomEvent();
}

protected virtual void OnRaiseCustomEvent()
{
    EventHandler handler = RaiseCustomEvent;

    if (handler != null)
    {
         handler(this, EventArgs.Empty););
    }
}
1 голос
/ 30 января 2012

Если вы хотите ответить на вызов в другой форме, вы можете добавить событие в другую форму и вызвать его в методе, на который вы пытаетесь ответить.

class Form1: Form
{
    public void Button1_Click(object sender, EventArgs e)
    {
        var form2 = new Form2();
        form2.SomeMethodCalled += Form2_SomeMethodCalled;
    }

    public void Form2_SomeMethodCalled(object sender, EventArgs e)
    {
        // method in form2 called
    }
}


class Form2 : Form
{
    public event EventHandler SomeMethodCalled;

    public void SomeMethod()
    {
        OnSomeMethodCalled();
        // .....
    }

    private void OnSomeMethodCalled()
    {
        var s = SomeMethodCalled;
        if(s != null)
        {
            s(this, EventArgs.Empty);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...