Estoy un poco confundido. Sé que puedo crear clases derivadas de EventArgs para tener datos de eventos personalizados. ¿Pero puedo emplear la clase base EventArgs de alguna manera? Al igual que el botón del mouse, haga clic en, en el método del suscriptor, siempre hay el parámetro "EventArgs e". ¿Puedo crear de alguna manera el método que pasará datos de esta manera, es decir, se aprobarán en la base Eventargs?¿Es posible pasar datos a EventArgs sin crear una clase derivada?
Respuesta
¿Es posible usar simplemente el tipo de datos EventArgs
raw? Absolutamente. De acuerdo con MSDN:
This class contains no event data; it is used by events that do not pass state information to an event handler when an event is raised. If the event handler requires state information, the application must derive a class from this class to hold the data.
http://msdn.microsoft.com/en-us/library/system.eventargs.aspx
private event TestEventEventHandler TestEvent;
private delegate void TestEventEventHandler(EventArgs e);
private void button1_Click(object sender, EventArgs e)
{
TestEvent += TestEventHandler;
if (TestEvent != null)
{
TestEvent(new EventArgs());
}
}
private void TestEventHandler(EventArgs e)
{
System.Diagnostics.Trace.WriteLine("hi");
}
Si alguna vez hacerlo? No por alguna razón, puedo pensar si. Si desea crear sus propios clics que sólo puede crear una instancia del MouseEventArgs
por su cuenta, también:
MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1);
Nope. La clase base EventArgs es solo una manera de permitir algunos tipos de delegados de eventos estándar. En última instancia, para pasar datos a un controlador, tendrá que crear una subclase EventArgs. Podría usar el remitente arg en su lugar, pero ese debería ser realmente el objeto que disparó el evento.
Usted puede utilizar la clase EventArgs a través del enfoque de los tipos genéricos. En esta muestra, voy a utilizar la clase Rect con como tipo de retorno:
public EventHandler<Rect> SizeRectChanged;
provocar el evento:
if(SizeRectChanged != null){
Rect r = new Rect(0,0,0,0);
SizeRectChanged(this,r);
}
escuchar el evento:
anyElement.SizeRectChanged += OnSizeRectChanged;
public void OnSizeRectChanged(object sender, Rect e){
//TODO abything using the Rect class
e.Left = e.Top = e.Width = e.Height = 50;
}
Por lo tanto, no es necesario Para crear nuevas clases de eventos o delegados, simplemente cree un EventHandler que pase el tipo específico T.
Esto parece incorrecto El [ejemplo de sitio web de MSDN] (http://msdn.microsoft.com/en-us/library/db0etb8x%28v=vs.110%29.aspx) muestra que Rect o TEventArg tienen que heredar de EventArgs. A menos que haya algo que esté malinterpretando. –
Thomas, esto me pareció confuso también. Pero la sugerencia de jupi funcionó para mí. –
Wow ... desearía haber sabido esto hace mucho tiempo. Siempre asumí que cuando declaró EventHandler
- 1. Uso de EventArgs para pasar información a la clase invocadora
- 2. ¿Es posible crear un objeto sin declarar una clase?
- 3. Cómo copiar/crear una instancia de clase derivada desde un puntero a una clase base polimórfica?
- 4. ¿Es posible anular un método estático en la clase derivada?
- 5. Convertir clase base a clase derivada
- 6. ¿Cómo pasar de una base de Modelo a una clase derivada en Django?
- 7. ¿Es posible pasar parámetros a una máscara?
- 8. Downcasting clase base no de plantilla a clase derivada de plantilla: ¿es posible?
- 9. ¿Es posible pasar cout o fout a una función?
- 10. Crear instancia de clase derivada de una instancia de clase base sin conocer los miembros de la clase
- 11. ¿Cómo 'de-serializar' una clase derivada de datos serializados?
- 12. En PHP, ¿es posible crear una instancia de una clase sin llamar al constructor de la clase?
- 13. C# - ¿Es posible reemplazar un método en una clase base dentro de la misma clase (NO una clase derivada)?
- 14. clase derivada Protegida
- 15. ¿Cómo es que un puntero a una clase derivada no se puede pasar a una función esperando una referencia a un puntero a la clase base?
- 16. C++ std :: ¿es posible copiar con el tipo de conversión a la clase derivada?
- 17. ¿Es posible anteponer datos a un archivo sin reescribir?
- 18. Java; clase base de conversión a la clase derivada
- 19. ¿Es posible pasar una clase como parámetro a una función en C++?
- 20. permanentemente fundido clase derivada basar
- 21. ¿Es posible crear una aplicación para iPhone sin productos Apple?
- 22. ¿Es posible agregar comportamiento a una clase de ActionScript 3 no dinámica sin heredar la clase?
- 23. ¿Es posible declarar una clase sin implementarla? (C++)
- 24. ¿Es posible extender una clase sin constructores en Java?
- 25. Añadir MetadataType a clase derivada en C#
- 26. ¿Puede una clase base determinar si una clase derivada ha reemplazado a un miembro virtual?
- 27. ¿Es posible crear una base de datos usando NHibernate?
- 28. Accediendo a un miembro/método de una clase derivada virtual
- 29. ¿Es posible pasar una llamada Clipsis directamente?
- 30. C++ clase base de fundición a la clase derivada lío
Si está intentando cargar datos en un evento de clic del mouse, no solo no puede hacer esto, sino que indica que hay un problema con su diseño. – Will
¿Alguna posibilidad de aclarar por qué esto es necesariamente un problema de diseño? ¿Puede un menú no ser visto semánticamente como una pila de botones, cuyo evento asociado le permite preguntar qué 'botón' realmente se presionó en el menú? ¿Qué principio de diseño está rompiendo al querer pasar información adicional junto con un clic de botón? – Patrick