пятница, 7 января 2022 г.

Обработчики событий в C#

 

Обработчик событий в C# — это делегат со специальной сигнатурой, приведенной ниже.


public delegate void MyEventHandler(object sender, MyEventArgs e);
С#

Первый параметр (отправитель) в приведенном выше объявлении указывает объект, вызвавший событие.


Второй параметр (e) приведенного выше объявления содержит данные, которые можно использовать в обработчике событий. Класс MyEventArgs является производным от класса EventArgs. EventArgs является базовым классом для более специализированных классов, таких как MouseEventArgs, ListChangedEventArgs и т. д. Для события GUI вы можете использовать объекты этих специализированных классов EventArgs без создания собственных специализированных классов EventArgs. Однако для события без графического интерфейса вам необходимо создать собственный специализированный класс EventArgs для хранения ваших данных, которые вы хотите передать объекту делегата. Вы создаете свой специализированный класс EventArgs, производный от класса EventArgs.

public class MyEventArgs : EventArgs
{
    public string m_myEventArgumentdata;
}
С#

В случае обработчика событий на объект делегата ссылаются с помощью ключевого слова event следующим образом:

public event MyEventHandler MyEvent;
С#

Теперь мы настроим два класса, чтобы увидеть, как этот механизм обработки событий работает в среде .Net. Шаг 2 в обсуждении делегатов требует, чтобы мы определили методы с точно такой же сигнатурой, как у объявления делегата. В нашем примере класс A предоставит обработчики событий (методы с той же сигнатурой, что и у объявления делегата). Он создаст объекты-делегаты (шаг 3 в обсуждении делегатов) и подключит обработчик событий. Затем класс A передаст объекты-делегаты классу B. Когда событие произойдет в классе B, он выполнит метод обработчика событий в классе A.

using System;
using System.Windows;

namespace DelegateEvent
{
    //Step 1 Create delegate object
    public delegate void MyHandler1(object sender, MyEventArgs e);
    public delegate void MyHandler2(object sender, MyEventArgs e);


    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            B b = new B();
            A a = new A(b);
            MyEventArgs e1 = new MyEventArgs();
            MyEventArgs e2 = new MyEventArgs();
            e1.m_id = "Event args for event 1";
            e2.m_id = "Event args for event 2";
            b.FireEvent1(e1);
            b.FireEvent2(e2);
        }

    }

    //Step 2 Create event handler methods
    public class A
    {
        public const string m_id = "Class A";

        public void OnHandler1(object sender, MyEventArgs e)
        {
            MessageBox.Show("I am in OnHandler1 and MyEventArgs is {0}", e.m_id);
        }

        public void OnHandler2(object sender, MyEventArgs e)
        {
            MessageBox.Show("I am in OnHandler2 and MyEventArgs is {0}", e.m_id);
        }
        
        //Step 3 create delegates, plug in the handler and register with the object that will fire the events
        public A(B b)
        {
            MyHandler1 d1 = new MyHandler1(OnHandler1);
            MyHandler2 d2 = new MyHandler2(OnHandler2);
            b.Event1 += d1;
            b.Event2 += d2;
        }

    }
    //Step 4 Calls the encapsulated methods through the delegates (fires events)
    public class B
    {
        public event MyHandler1 Event1;
        public event MyHandler2 Event2;

        public void FireEvent1(MyEventArgs e)
        {
            if (Event1 != null)
            {
                Event1(this, e);
            }
        }

        public void FireEvent2(MyEventArgs e)
        {
            if (Event2 != null)
            {
                Event2(this, e);
            }
        }
    }

    public class MyEventArgs : EventArgs
    {
        public string m_id;
    } 


}
С#


Обработка событий GUI в C#

Обработка событий в Windows Forms (инфраструктура .NET, поддерживающая приложение с графическим интерфейсом) использует модель обработки событий .NET, описанную ранее. Теперь мы применим эту модель для написания простого приложения. Приложение имеет один класс MyForm, производный от класса System.Windows.Forms.Form. Класс MyForm является производным от класса Form. Если вы изучите код и три строки комментариев, вы заметите, что вам не нужно объявлять делегатов и ссылаться на них, используя ключевое слово event, потому что события (щелчок мышью и т. д.) для элементов управления графического интерфейса (форма, кнопка и т. д.) .) уже доступны вам, а делегатом является System.EventHandler. Однако вам по-прежнему необходимо определить метод, создать объект делегата (System.EventHandler) и подключить метод, который вы хотите активировать в ответ на событие (например, щелчок мыши), в объект делегата.  

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
public class MyForm : Form
{
    private Button m_nameButton;
    private Button m_clearButton;
    private Label m_nameLabel;
    private Container m_components = null;
    public MyForm()
    {
        initializeComponents();
    }
    private void initializeComponents()
    {
        m_nameLabel = new Label();
        m_nameButton = new Button();
        m_clearButton = new Button();
        SuspendLayout();
        m_nameLabel.Location = new Point(16, 16);
        m_nameLabel.Text = "Click NAME button, please";
        m_nameLabel.Size = new Size(300, 23);
        m_nameButton.Location = new Point(16, 120);
        m_nameButton.Size = new Size(176, 23);
        m_nameButton.Text = "NAME";
        //Create the delegate, plug in the method, and attach the delegate to the Click event of the button
        m_nameButton.Click += new System.EventHandler(NameButtonClicked);
        m_clearButton.Location = new Point(16, 152);
        m_clearButton.Size = new Size(176, 23);
        m_clearButton.Text = "CLEAR";
        //Create the delegate, plug in the method, and attach the delegate to the Click event of the button
        m_clearButton.Click += new System.EventHandler(ClearButtonClicked);
        this.ClientSize = new Size(292, 271);
        this.Controls.AddRange(new Control[]
        m_nameLabel, m_nameButton, m_clearButton});
        this.ResumeLayout(false);
    }
    //Define the methods whose signature exactly matches with the declaration of the delegate
    private void NameButtonClicked(object sender, EventArgs e)
    {
        m_nameLabel.Text = "My name is john, please click CLEAR button to clear it";
    }
    private void ClearButtonClicked(object sender, EventArgs e)
    {
        m_nameLabel.Text = "Click NAME button, please";
    }
    public static void Main()
    {
        Application.Run(new MyForm());
    }
}
С#

Вывод

Комментариев нет:

Отправить комментарий

Паттерн 'Репозиторий' в ASP.NET

  Последнее обновление: 1.11.2015         Одним из наиболее часто используемых паттернов при работе с данными является паттерн 'Репозито...