Кнопка EventHandler в форме - PullRequest
2 голосов
/ 02 декабря 2011

Кнопка, которую мы можем создать в форме, написана в терминах обработчика событий в Form1.Designer.cs как

this.button1.Click += new System.EventHandler(this.button1_Click);

Здесь Click - это тип public event EventHandler, а этот EventHandler является делегатом

.
public delegate void EventHandler(object sender, EventArgs e);

Теперь

почему не может быть '=' (равно)

this.button1.Click = new System.EventHandler(this.button1_Click);

а также когда я передаю аргумент this.button1_Click, как он совпадает с void EventHandler(object sender, EventArgs e); делегат? Как здесь у меня есть два аргумента.

Пожалуйста, очистите меня с этим.

Спасибо

Ответы [ 5 ]

1 голос
/ 02 декабря 2011

ttSo, давайте посмотрим, что такое событие.

код, вы пишете

public event EventHandler MyEvent;

скомпилируется в

private EventHandler MyEvent = null;

[MethodImp(MethodImplOptions.Synchronized)]
public void add_MyEvent(EventHandler value) {
    MyEvent = (EventHandler)Delegate.Combine(MyEvent, value);
}

[MethodImp(MethodImplOptions.Synchronized)]
public void remove_MyEvent(EventHandler<NewMailEventArgs> value) {
    MyEvent = (EventHandler)Delegate.Remove(MyEvent, value);
}

Итак, как вы видите, вы не можете напрямую получить доступ к делегату и можете только вызывать + = и - =, который переопределяется для класса событий. Также вы можете вручную управлять этим механизмом, переопределяя методы + = и - =. Вы можете сделать это так:

public event EventHandler MyEvent
{
   add { //your code for += here }
   remove { //your code for -= here }
}

Подробнее о мероприятии и делегатах вы можете прочитать в книге "CLR via C #". Я нашел все это в этой книге.

1 голос
/ 02 декабря 2011

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

1 голос
/ 02 декабря 2011

Что делать, если вы хотите иметь несколько методов, вызываемых по событию Click. Что вы делаете с

this.button1.Click += new System.EventHandler(this.button1_Click);

регистрируется для вызова метода this.button1_Click, который вызывается при возникновении события Click. += добавляет обработчик и НЕ назначает обработчик.

0 голосов
/ 02 декабря 2011

Дорогой Нагарадж Тантри,

. Для вопроса 1: Как сказано выше, Делегат может настроить мульти-событие.

Для вопроса 2: Как сказал Кулити, если вы хотите передать пользовательские аргументы через событие Event

click, если вы хотите использовать EventHandler и передать собственный аргумент cutom

, вы должны настроить свой класс управления ипользовательский собственный аргумент события,

пользовательский параметр события CustomEventArg должен наследовать EventArg class.

Вы можете взять пример кода, как показано ниже.

// Customs ColorChanged's event parameter.     
public class ColorChangedEventArgs : EventArgs
{
    private Color color;
    public ColorChangedEventArgs(Color c)
    {
        color = c;
    }

    public Color GetColor
    {
        get { return color; }
    }
}


    //Add this method in your custom control
    protected void ibtnTest_Click(object sender, ColorChangedEventArgs e)
    {
        //TODO;
    }

Вы также можете ссылаться на MSDN здесь

0 голосов
/ 02 декабря 2011

1 / это не может быть '=' (равно), потому что делегат похож на указатель на функцию 2 / Если вы хотите передать параметр нажатию кнопки события, вы должны создать свой собственный класс кнопки и реализовать событие Click, и у вас есть собственный EventArgs

пример кода:

public class MyEventArg
{
    int _param1;
    string _param2;
    //you can add more param
    public MyEventArg(int _param1,string _param2)
    {
        this._param1 = _param1;
        this._param2 = _param2;
    }
}

public delegate void MyButtonClickHandler(object sender, MyEventArg e)
public class MyButton:Control
{
     public event MyButtonClickHandler OnMyClick;
     //You can raise your event here
 protected override void OnClick(EventArgs e)
 {
           MyEventArg e = new MyEventArg(1,"a");//just sample data here
           this.OnMyClick(this,e);
     }
}

В форме, содержащей класс MyButton Instant

public partial class Form1 : Form
{
    MyButton myButton = new MyButton();
    public Form1()
    {
        InitializeComponent();
        myButton.OnMyClick += new MyButtonClickHandler(this.myButton_OnMyClicked);
    }

    private void myButton_OnMyClicked(object sender, MyEventArg e){
    //your implementation        
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...