2010-08-15 10 views
23

Tengo un UserControl que contiene 3 etiquetas. Quiero agregarle un evento, que ocurre cuando el texto de una de las etiquetas cambia.
Estoy utilizando Visual Studio 2010¿Cómo agregar un evento a UserControl en C#?

+0

¿Está utilizando Windows Forms o WPF? –

+0

No sé, utilizo UserControl, pero no WPF – Saeed

Respuesta

47

En primer lugar, tiene que 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 de las etiquetas individuales 'TextChanged.

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, es necesario suscribirse a TextChanged eventos de 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 heredadas 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 aumento de eventos.

Aquí está nuestro OnLabelsTextChanged:

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

Tenemos que comprobar la nula debido a un evento sin suscriptores es nulo. Si intentamos plantear un evento nulo, obtendríamos un NullReferenceException. Tenga en cuenta que copiamos el evento EventHandler en una variable local antes de comprobar que no sea válido y de que aparezca 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 la verificación de nulidad y la activación del 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: Así es como la línea public event EventHandler LabelsTextChanged; se debe colocar:

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

     ... 
    } 
} 

Here son las directrices de diseño de marco de diseño de eventos para su posterior lectura.

+0

su idea también tiene el mismo problema, el compilador dice:
"Esperado clase, delegado, enumeración, interfaz, o estructura"
en la primera línea que tiene un problema con el evento – Saeed

+1

@saeed: ¿Dónde están poniendo ' evento público EventHandler LabelsTextChanged; '? Tiene que estar * dentro * de su clase (no dentro de un método o fuera de la definición de la clase). –

+0

tnx, resuelto ... – Saeed

0
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

Tiene un error de compilación, que dice: "clase, delegado, enumeración, interfaz o estructura esperada" en la segunda línea parece que tiene un problema con " evento " – Saeed

2

En primer lugar debe declarar un evento en su control de usuario, por ejemplo:

public event EventHandler TextOfLabelChanged; 

entonces usted tiene que llamar a la llamada a la función que está obligado a su evento (volver si hay alguna) en runtime.You puede hacer esto mediante el manejo del evento TextChanged de una etiqueta como esta:

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

usted puede tener sus propias EventArgs obje ct si quieres.

algún lugar de su código que debe obligarse su etiqueta de evento TextChanged a este método como este:

_myLabel.TextChanged+=LabelTextChanged; 
+0

¿por qué usas" if (TextOfLabelChanged! = null) "? – Saeed

+0

Tiene un error de compilación, que dice: "Clase esperada, delegar, enumerar, interfaz o estructura" en la primera línea – Saeed

+1

@saeed: Tenemos que verificar si no hay nulo porque un evento sin suscriptores es nulo. Si tratamos de plantear un evento nulo, obtendríamos una 'NullReferenceException'. –

1

error de compilación, que dice: "Esperado clase, delegado, enumeración, interfaz, o estructura" en la segunda línea que parece tener un problema con el "caso ...


Estas 2 líneas necesitan estar dentro de la declaración de clase.

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

Usted debe estar declarando la event y delegate dentro del Namespace. Trata de llevar el código dentro del alcance class. se ejecutará bien.

1

¡Hay una forma muy simple de hacerlo!

En el Formulario de control de usuario:

  1. propiedades de cambio a pública para acceder a todas partes

en el formulario principal, donde se está utilizando control de usuario:

0.5: en la región using agregar using userControl1=UserControl.userControl1

1.Añadir evento 'Laod' a su UserControl:

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

2.In la 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 º label1_TextChanged:

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