Объясните код для пользовательского события в пользовательском элементе управления - PullRequest
7 голосов
/ 22 октября 2010

Кто-то дал мне этот код, который прекрасно работает. Но мне бы очень хотелось понять, что происходит внутри. Может кто-нибудь объяснить, пожалуйста? В чем смысл каждой части кода? Код находится внутри пользовательского элемента управления, который имеет две метки внутри панели.

Также я видел некоторые пользовательские события управления, которые используют синтаксис добавления / удаления, для чего это нужно? Какая разница с тем, что здесь происходит?

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    public event EventHandler MyCustomClickEvent;

    protected virtual void OnMyCustomClickEvent(EventArgs e)
    {
        // Here, you use the "this" so it's your own control. You can also
        // customize the EventArgs to pass something you'd like.

        if (MyCustomClickEvent != null)
            MyCustomClickEvent(this, e);
    }

    private void label1_Click(object sender, EventArgs e)
    {
        OnMyCustomClickEvent(EventArgs.Empty);
    }
}

Ответы [ 4 ]

8 голосов
/ 22 октября 2010

Смотрите мои комментарии ниже. Также для более подробного мероприятия я написал в блоге об этой концепции некоторое время назад, где я углубляюсь в подробности всего процесса.

public partial class UserControl1 : UserControl
{
    //This is the standard constructor of a user control
    public UserControl1()
    {
        InitializeComponent();
    }

    //This defines an event called "MyCustomClickEvent", which is a generic
    //event handler.  (EventHander is a delegate definition that defines the contract
    //of what information will be shared by the event.  In this case a single parameter
    //of an EventArgs object.
    public event EventHandler MyCustomClickEvent;


    //This method is used to raise the event, when the event should be raised, 
    //this method will check to see if there are any subscribers, if there are, 
    //it raises the event
    protected virtual void OnMyCustomClickEvent(EventArgs e)
    {
        // Here, you use the "this" so it's your own control. You can also
        // customize the EventArgs to pass something you'd like.

        if (MyCustomClickEvent != null)
            MyCustomClickEvent(this, e);
    }

    private void label1_Click(object sender, EventArgs e)
    {
        OnMyCustomClickEvent(EventArgs.Empty);
    }
}
2 голосов
/ 22 октября 2010

Я бы рекомендовал прочитать о События для C # на MSDN . Это подробно описано.

По сути, MyCustomClickEvent - это событие. Метод OnMyCustomClickEvent используется для вызова события, но выполняется таким образом, чтобы подклассы также могли вызывать это событие, если требуется.

Когда вы нажимаете «label1», запускается метод OnMyCustomClickEvent, который вызывает событие. Любые делегаты, подписавшиеся на событие, будут выполняться в этот момент.

1 голос
/ 22 октября 2010

Вы упоминали, что видели синтаксис добавления / удаления для событий в некоторых примерах пользовательских элементов управления.Скорее всего, эти примеры используют свойство UserControl class 'Events для хранения обработчиков событий, например, в следующем примере:

    public event EventHandler MyEvent
    {
        add
        {
            Events.AddHandler("MyEvent", value);
        }
        remove
        {
            Events.RemoveHandler("MyEvent", value);
        }
    }

Идея заключается в том, что обычнопотребитель элемента управления не захочет обрабатывать каждое отдельное событие, предоставляемое элементом управления.Если каждое событие определено как событие «поля» (как в вашем примере), то каждое событие будет занимать часть памяти, даже если для этого события нет подписчиков.Если у вас сложная страница, состоящая из сотен элементов управления, каждый из которых может содержать десятки событий, потребление памяти для неиспользуемых событий не будет незначительным.

Именно поэтому класс System.ComponentModel.Component (базовый класскласс System.Windows.Forms.Control) имеет свойство Events, которое представляет собой словарь для хранения делегатов обработчиков событий.Таким образом, каждое событие реализовано больше как свойство, чем поле.Обработчики добавления / удаления для каждого хранилища событий или удаления делегатов из словаря Events.Если событие не используется, то в словаре Events для него просто нет записи, и для этого события не используется дополнительная память.Это компромисс, заключающийся в том, что нужно немного больше работать (нужно искать обработчик событий), чтобы сэкономить немного больше памяти.

РЕДАКТИРОВАТЬ: исправлен мой ответ, относящийся к Windows Forms, а не к ASP.NET, хотяпонятия одинаковы.

0 голосов
/ 22 октября 2010

Что касается добавления / удаления, это «ручная» реализация событий.Следующие два фрагмента делают одно и то же.

Автоматическая реализация:

public event EventHandler MyEvent;

Ручная реализация:

private EventHandler _myEvent;

public event EventHandler MyEvent
{
    add { _myEvent += value; }
    remove { _myEvent -= value; }
}

Это в точности то же самое, что и автоматические свойства, где:

public string Property { get; set; };

Действует точно так же, как:

private string _property;

public string Property
{
    get { return _property; }
    set { _property = value; }
}

Разница между этими фрагментами заключается в том, что с ручными реализациями вы получаете больше контроля.Примеры:

  • Реализация логики в добавлении / получении и удалении / установке;
  • Получите доступ к полям, которые позволяют вам установить, например, [NonSerializable];
  • Поместите значения, например, в Dictionary.

Класс Form, например, делает последний, чтобы уменьшить количество полей в классе Form.

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