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


Tengo un UserControl que contiene 3 etiquetas. Quiero agregar un evento para él, que ocurre cuando el texto de una de las etiquetas cambia.
Estoy usando Visual Studio 2010

Author: shA.t, 2010-08-15

6 answers

Primero, necesitas declarar el evento dentro de tu clase (junto con tus métodos y constructores):

public event EventHandler LabelsTextChanged;

Luego necesita crear un método para manejar los eventos TextChanged de las etiquetas 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 tu control, necesitas suscribirte a los eventos TextChanged de la etiqueta.

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

Ahora para el método HandleLabelsTextChanged. Podríamos plantear LabelsTextChanged directamente; sin embargo, las directrices de diseño de. NET framework dicen que es una mejor práctica crear un OnEventName método virtual protegido para elevar el evento para nosotros. De esta manera, 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 cree que nunca anulará el método OnEventName, es una buena idea acostumbrarse a hacerlo de todos modos, ya que simplifica el proceso de subida 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 null porque un evento sin los suscriptores son nulos. Si intentáramos elevar un evento nulo, obtendríamos un NullReferenceException. Tenga en cuenta que copiamos el evento EventHandler a una variable local antes de comprobarlo para null y elevar el evento. Si lo hubiéramos hecho así:

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

Tendríamos una condición de carrera entre el check de nulidad y el raising del evento. Si simplemente sucediera que los suscriptores del evento se cancelaron la suscripción justo antes de que aumentáramos el evento, pero después de verificar null, una excepción sería lanzar. Normalmente no se encontrará con este problema, pero es mejor adquirir el hábito de escribirlo de la manera segura.

Edit: Aquí es cómo se debe colocar la línea public event EventHandler LabelsTextChanged;:

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

        ...
    }
}

Aquí están las directrices de diseño de marco sobre diseño de eventos para lectura adicional.

 49
Author: Zach Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-15 06:43:10

Primero debes declarar un evento en tu usercontrol por ejemplo:

public event EventHandler TextOfLabelChanged;

Entonces tienes que llamar a la función call back que está vinculada a tu evento(si hay alguno) en tiempo de ejecución.Puedes hacer esto 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 evento label TextChanged a este método de la siguiente manera:

_myLabel.TextChanged+=LabelTextChanged;
 3
Author: Beatles1692,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-15 05:59:27

Error de compilación, que dice: "Clase esperada, delegado, enumeración, interfaz o estructura" en la segunda línea parece tener un problema con "evento...


Estas 2 líneas deben estar DENTRO de la declaración de clase.

public delegate void TextChangedEventHandler(object sender, EventArgs e);
public event TextChangedEventHandler LabelTextChanged;
 1
Author: Vince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-01 01:37:02

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á utilizando UserControl:

.5: en la región using añádase using userControl1=UserControl.userControl1

1.Añade el evento 'Laod' a tu UserControl :

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

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

 private void label1_TextChanged(object sender, EventArgs e)
 {
     //do whatever you want
 }
 1
Author: AliTheOne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-03 18:53:56
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
Author: thelost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-15 05:56:38

Debes declarar el event y delegate dentro del Namespace. Intente colocar el código dentro del ámbito class. Funcionará bien.

 0
Author: prem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-16 07:45:02