Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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;

        ...
    }
}

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

Ответ 2

Сначала вы должны объявить событие в своем usercontrol, например:

public event EventHandler TextOfLabelChanged;

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

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

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

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

_myLabel.TextChanged+=LabelTextChanged;

Ответ 3

Ошибка компиляции, в которой говорится: "Ожидаемый класс, делегат, перечисление, интерфейс или структура" во второй строке, похоже, имеет проблему с "событием...


Эти две строки должны быть ВНУТРИ объявления класса.

public delegate void TextChangedEventHandler(object sender, EventArgs e);
public event TextChangedEventHandler LabelTextChanged;

Ответ 4

Существует очень простой способ сделать это!

В форме UserControl:

  • изменить общедоступность для доступа во всем мире

в основной форме, где вы используете UserControl:

.5: в области using добавьте using userControl1=UserControl.userControl1

1. Добавьте событие "Laod" в свой UserControl:

this.userControl1.Load += new System.EventHandler(this.userControl1_Load);

2. В userControl1_Load:

private void userControl1_Load(object sender, EventArgs e)
{
     (sender as UserControl1).label1.TextChanged += label1_TextChanged; 
     //add a 'TextChanged' event to the label1 of UserControl1 
     OR use direct cast:
     ((UserControl1) sender).label1.TextChanged += label1_TextChanged;

}

3.In th label1_TextChanged:

 private void label1_TextChanged(object sender, EventArgs e)
 {
     //do whatever you want
 }

Ответ 5

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

Ответ 6

Вы должны объявить event и delegate в Namespace. Попробуйте привести код в область class. Он будет работать нормально.