¿Cómo agregar un evento a UserControl en C #?

Tengo un UserControl que contiene 3 tags. Quiero agregarle un evento, que ocurre cuando el texto de una de las tags cambia.
Estoy usando Visual Studio 2010

Primero, necesita declarar el evento dentro de su clase (junto con sus métodos y constructores):

public event EventHandler LabelsTextChanged; 

Luego debe crear un método para manejar los eventos TextChanged las tags individuales.

 private void HandleLabelTextChanged(object sender, EventArgs e) { // we'll explain this in a minute this.OnLabelsTextChanged(EventArgs.Empty); } 

En algún lugar, probablemente en el constructor de su control, necesita suscribirse a los eventos TextChanged la etiqueta.

 myLabel1.TextChanged += this.HandleLabelTextChanged; myLabel2.TextChanged += this.HandleLabelTextChanged; myLabel3.TextChanged += this.HandleLabelTextChanged; 

Ahora para el método HandleLabelsTextChanged . Podríamos subir LabelsTextChanged directamente; sin embargo, las directrices de diseño de .NET Framework dicen que es una buena práctica crear un método virtual protegido OnEventName para plantearnos el evento. De esta forma, las clases OnEventName pueden “manejar” el evento anulando el método OnEventName , que resulta tener un rendimiento un poco mejor que suscribirse al evento. Incluso si piensa que nunca anulará el método OnEventName , es una buena idea tener el hábito de hacerlo de todos modos, ya que simplifica el proceso de OnEventName eventos.

Aquí está nuestro OnLabelsTextChanged :

 protected virtual void OnLabelsTextChanged(EventArgs e) { EventHandler handler = this.LabelsTextChanged; if (handler != null) { handler(this, e); } } 

Tenemos que verificar el nulo porque un evento sin suscriptores es nulo. Si intentamos generar un evento nulo, obtendríamos una NullReferenceException . Tenga en cuenta que copiamos EventHandler del evento a una variable local antes de comprobar que no sea nulo y que se haya generado el evento. Si en cambio lo hubiéramos hecho así:

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

Tendríamos una condición de carrera entre el control de nulidad y el evento. Si sucedió que los suscriptores del evento se cancelaron la suscripción justo antes de que planteáramos el evento, pero después de que verificamos el nulo, se lanzaría una excepción. Normalmente no se encontrará con este problema, pero lo mejor es acostumbrarse a escribirlo de manera segura.

Editar: Aquí es cómo el public event EventHandler LabelsTextChanged; línea debe colocarse:

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

Aquí están las pautas de diseño del marco en el diseño del evento para una lectura adicional.

Primero debe declarar un evento en su usercontrol por ejemplo:

 public event EventHandler TextOfLabelChanged; 

luego tiene que llamar a la función de callback que está vinculada a su evento (si hay alguno) en tiempo de ejecución. Puede hacerlo manejando el evento TextChanged de una etiqueta como esta:

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

Puede tener su propio objeto EventArgs si lo desea.

en algún lugar de su código, debe vincular su etiqueta evento TextChanged a este método de esta manera:

 _myLabel.TextChanged+=LabelTextChanged; 

compile error, que dice: “Clase esperada, delegar, enum, interfaz o struct” en la segunda línea, parece tener un problema con “evento …


Estas 2 líneas deben estar DENTRO de la statement de clase.

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

¡Hay una manera muy simple de hacer eso!

En el formulario UserControl:

  1. cambiar las propiedades a público para acceder a todas partes

en el formulario principal, donde está usando UserControl:

.5: en la región de using , agregue el using userControl1=UserControl.userControl1

1.Añada el evento ‘Laod’ a su UserControl:

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

2.En el 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.En el label1_TextChanged:

  private void label1_TextChanged(object sender, EventArgs e) { //do whatever you want } 
 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); } } 

Debe declarar el event y delegate dentro del Namespace . Trate de traer el código dentro de la class Scope. Funcionará bien.