Сначала вам нужно объявить событие в вашем классе (вместе с вашими методами и конструкторами):
public event EventHandler LabelsTextChanged;
Затем вам нужно создать метод для обработки событий TextChanged
отдельных меток.
private void HandleLabelTextChanged(object sender, EventArgs e)
{
// we'll explain this in a minute
this.OnLabelsTextChanged(EventArgs.Empty);
}
Где-то, вероятно, в конструкторе вашего элемента управления, вам необходимо подписаться на события TextChanged
метки.
myLabel1.TextChanged += this.HandleLabelTextChanged;
myLabel2.TextChanged += this.HandleLabelTextChanged;
myLabel3.TextChanged += this.HandleLabelTextChanged;
Теперь для метода HandleLabelsTextChanged
.Мы могли бы поднять LabelsTextChanged
напрямую;однако в рекомендациях по разработке .NET Framework говорится, что рекомендуется создать защищенный виртуальный метод OnEventName
, чтобы поднять событие для нас.Таким образом, наследуемые классы могут «обрабатывать» событие, переопределяя метод OnEventName
, который, как оказалось, имеет немного лучшую производительность, чем подписка на событие.Даже если вы думаете, что никогда не будете переопределять метод OnEventName
, это хорошая идея, чтобы все равно привыкнуть делать это, поскольку это упрощает процесс создания событий.
Вот наш OnLabelsTextChanged
:
protected virtual void OnLabelsTextChanged(EventArgs e)
{
EventHandler handler = this.LabelsTextChanged;
if (handler != null)
{
handler(this, e);
}
}
Мы должны проверить на нулевое значение, поскольку событие без подписчиков является нулевым.Если бы мы попытались вызвать нулевое событие, мы бы получили NullReferenceException
.Обратите внимание, что мы копируем событие EventHandler
в локальную переменную, прежде чем проверять его на нулевое значение и вызывать событие.Если бы мы вместо этого сделали это так:
if (this.LabelsTextChanged != null)
{
this.LabelsTextChanged(this, e);
}
У нас было бы условие гонки между проверкой недействительности и повышением события.Если так получилось, что подписчики на событие отписались от подписки непосредственно перед тем, как мы подняли событие, но после того, как мы проверили нулевое значение, возникнет исключение.Обычно вы не столкнетесь с этой проблемой, но лучше привыкнуть писать ее безопасным способом.
Редактировать: Вот как должна быть расположена строка public event EventHandler LabelsTextChanged;
:
namespace YourNamespace
{
class MyUserControl : UserControl
{
// it needs to be here:
public event EventHandler LabelsTextChanged;
...
}
}
Здесь - руководящие принципы разработки структуры для разработки событий для дальнейшего чтения.