Заставить функцию ждать события C # - PullRequest
3 голосов
/ 09 января 2011

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

Есть ли прямой способ сделать это?

PM

1 Ответ

4 голосов
/ 09 января 2011

Предполагая WinForms, есть несколько подходов, которые вы могли бы использовать. Вы можете представить каждую кнопку как свойство в своем классе формы, а класс, создающий форму, будет подписан на событие Click для каждой кнопки. Например,

В классе Форма:

public class MyForm : Form 
{
    // form initialization, etc, etc.

    public Button Button1 
    {
        get { return button1; }
    }
}

В классе, который создает форму:

public class MyClass
{
    public Form CreateForm()
    {
        var form = new MyForm();
        form.Button1.Click += HandleButton1Clicked;
        return form;
    }

    private void HandleButton1Clicked(object sender, EventArgs e)
    {
        // do whatever you need to do when Button1 is clicked
    }
}

В качестве альтернативы, вы можете добавить событие ButtonClicked в форму и определить, какая кнопка была нажата таким образом. Форма будет подписываться на каждое из событий Click ее кнопки и будет запускать ButtonClicked с кнопкой в ​​качестве отправителя.

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


Отредактировано для адаптации к рабочему процессу в комментариях:

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

public class MyForm : Form 
{
    // form initialization, etc, etc.
    private Button button1;
    private Button button2;

    public MyForm()
    {
        InitializeComponent();
        button1.Click += HandleButtonClicked;
        button1.DialogResult = DialogResult.OK;
        button2.Click += HandleButtonClicked;
        button2.DialogResult = DialogResult.OK;
    }

    private void HandleButtonClicked(object sender, EventArgs e)
    {
        ButtonClicked = sender as Button;
    }

    public Button ButtonClicked
    {
        get; private set;
    }
}

Телефонный код:

public class MyClass
{
    public int GetValue()
    {
        var form = new MyForm();
        if(form.ShowDialog() == DialogResult.OK) // this will block until form is closed
        {
            // return some value based on form.ButtonClicked
            // adjust method's return type as necessary
        }
        else 
        {
            // do something if the user closed the form without 
            // clicking on one of the buttons
        }
    }
}

Обратите внимание, что обработчик события HandleButtonClicked одинаков для обеих кнопок, поскольку форма просто хранит информацию о том, какая кнопка была нажата.

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