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#?
Respuesta
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.
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
@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). –
tnx, resuelto ... – Saeed
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);
}
}
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
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;
¿por qué usas" if (TextOfLabelChanged! = null) "? – Saeed
Tiene un error de compilación, que dice: "Clase esperada, delegar, enumerar, interfaz o estructura" en la primera línea – Saeed
@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'. –
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;
Usted debe estar declarando la event
y delegate
dentro del Namespace
. Trata de llevar el código dentro del alcance class
. se ejecutará bien.
¡Hay una forma muy simple de hacerlo!
En el Formulario de control de usuario:
- 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
}
- 1. ¿Cómo agrego la funcionalidad Dispose a un C# UserControl?
- 2. Agregar participante a un evento en iOS
- 3. Haga clic en evento en UserControl- WPF
- 4. ¿Cómo llamar un evento manualmente en C#?
- 5. Agregar formulario a un UserControl: ¿es esto posible?
- 6. Cómo usar un ContextMenu UserControl en WPF?
- 7. ¿Qué evento se dispara cuando se muestra un UserControl?
- 8. Agregar WPF UserControl a la ventana WPF en el código
- 9. Agregar un evento de clic a un elemento?
- 10. C# UserControl Propiedad visible
- 11. Cómo agregar UserControl a un Panel en una Ventana de WPF
- 12. agregar evento a Jquery Plugin
- 13. ¿Cómo puedo agregar un evento onScroll a iScroll4?
- 14. C# genéricos Usercontrol
- 15. WPF ¿Cómo obtener un UserControl para heredar un botón?
- 16. ¿Cómo puedo pasar un evento a una función en C#?
- 17. Cómo hacer referencia a un evento en C#
- 18. ¿Cómo averiguas qué está suscrito a un evento en C#?
- 19. cómo agregar un DateTimeOffset a un DateTime en C#?
- 20. Propiedad del texto en un UserControl en C#
- 21. Capturar eventos KeyDown en un UserControl
- 22. Encuadernación ObservableCollection items a UserControl en WrapPanel?
- 23. ¿Múltiples suscriptores al evento UserControl de ASP.NET único?
- 24. Cómo llamar a un método en un UserControl después de que se muestra?
- 25. ¿Cómo puedo disparar el evento antes de agregar el elemento a la colección en C#?
- 26. Cómo agregar un evento en Google Calendar desde la actividad?
- 27. Cómo agregar un evento onchange para seleccionar etiqueta en rieles
- 28. Cómo agregar un evento de clic por nombre de clase?
- 29. INotifyPropertyChanged en UserControl
- 30. ¿Cómo agregar texto a un archivo de texto en C++?
¿Está utilizando Windows Forms o WPF? –
No sé, utilizo UserControl, pero no WPF – Saeed