Как добавить событие в UserControl в C #?

У меня есть UserControl, который содержит 3 метки. Я хочу добавить для него событие, которое происходит, когда текст одной из меток изменился.
Я использую Visual Studio 2010

25
задан shA.t 8 February 2018 в 07:01
поделиться

3 ответа

Во-первых, вам нужно объявить событие в вашем классе (вместе с вашими методами и конструкторами):

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);
    }
}

Мы должны проверить значение null, потому что событие без подписчиков имеет значение null. Если бы мы попытались вызвать нулевое событие, мы получили бы исключение NullReferenceException . Обратите внимание, что мы копируем событие EventHandler в локальную переменную, прежде чем проверять его на null и вызывать событие. Если бы мы вместо этого сделали это так:

if (this.LabelsTextChanged != null)
{
    this.LabelsTextChanged(this, e);
}

У нас было бы состояние гонки между проверкой на null и возникновением события. Если так получилось, что подписчики на событие отменили подписку непосредственно перед тем, как мы инициировали событие, но после того, как мы проверили значение null, было бы сгенерировано исключение. Обычно вы не сталкиваетесь с этой проблемой, но лучше выработать привычку писать ее безопасным способом.

Редактировать: Вот как должна быть размещена строка публичного события EventHandler LabelsTextChanged; :

namespace YourNamespace
{
    class MyUserControl : UserControl
    {
        // it needs to be here:
        public event EventHandler LabelsTextChanged;

        ...
    }
}

Здесь приведены руководящие принципы разработки фреймворка по дизайну событий для дальнейшего чтения.

52
ответ дан 28 November 2019 в 20:33
поделиться

Сначала вы должны объявить событие в вашем пользовательском элементе управления, например:

public event EventHandler TextOfLabelChanged;

, тогда вы должны вызвать функцию обратного вызова, которая является привязаны к вашему событию (если таковое имеется) во время выполнения. Вы можете сделать это, обработав событие TextChanged метки следующим образом:

public void LabelTextChanged(object sender,EventArgs e)
{
if(TextOfLabelChanged!=null)
TextOfLabelChanged(sender,e);
}

Вы можете иметь свой собственный объект EventArgs, если хотите.

где-то в вашем коде вы должны привязать событие метки TextChanged к этому методу следующим образом:

_myLabel.TextChanged+=LabelTextChanged;
3
ответ дан 28 November 2019 в 20:33
поделиться
public delegate void TextChangedEventHandler(object sender, EventArgs e);
public event TextChangedEventHandler LabelTextChanged;

// ...

protected void MyTextBox_TextChanged(object sender, EventArgs e)
{
    if (LabelTextChanged != null) {
        LabelTextChanged(this, e);
    }
}
0
ответ дан 28 November 2019 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: