Ответ 1
Сначала вам нужно объявить событие в своем классе (рядом с вашими методами и конструкторами):
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 говорится, что лучше всего создать виртуальный метод OnEventName
, чтобы поднять это событие для нас. Таким образом, наследование классов может "обрабатывать" событие, переопределяя метод OnEventName
, который, как оказалось, имеет немного лучшую производительность, чем подписка на событие. Даже если вы считаете, что никогда не будете переопределять метод OnEventName
, это хорошая идея, чтобы привыкнуть к этому, так как это упрощает процесс поднятия событий.
Здесь наш OnLabelsTextChanged
:
protected virtual void OnLabelsTextChanged(EventArgs e)
{
EventHandler handler = this.LabelsTextChanged;
if (handler != null)
{
handler(this, e);
}
}
Мы должны проверить значение null, потому что событие без подписчиков имеет значение null. Если бы мы попытались поднять нулевое событие, мы получили бы NullReferenceException
. Обратите внимание, что мы скопируем событие EventHandler
в локальную переменную, прежде чем проверять его на null и поднимать событие. Если бы мы сделали это так:
if (this.LabelsTextChanged != null)
{
this.LabelsTextChanged(this, e);
}
У нас было бы условие гонки между проверкой недействительности и поднятием события. Если бы так получилось, что подписчики на событие отменили подписку непосредственно перед тем, как мы подняли это событие, но после того, как мы проверили значение null, будет выбрано исключение. Обычно вы не сталкиваетесь с этой проблемой, но лучше всего привыкнуть писать ее безопасным способом.
Изменить: Вот как следует поместить строку public event EventHandler LabelsTextChanged;
:
namespace YourNamespace
{
class MyUserControl : UserControl
{
// it needs to be here:
public event EventHandler LabelsTextChanged;
...
}
}
Здесь являются руководящими принципами разработки дизайна событий для дальнейшего чтения.