2010-03-15 17 views
5

Actualmente estoy haciendo la transición de VB a C# y tengo algunos problemas con respecto a registrar mi interés en un evento.¿Dónde registrarse para los eventos de C#?

Cuando se utilizaba VB, era simplemente una cuestión de especificar que un método Handles y evento, a menudo esto se generaba utilizando la lista de eventos del objeto. Si bien puedo usar fácilmente el Class.event += delegate en C#, no estoy seguro de cuál es el mejor lugar para colocar el código para hacer esto.

¿Es mejor colocarlo dentro del InitializeComponent() según el código generado (digamos si seleccionas el evento en el diseñador from) o debo colocarlo dentro del constructor para una mejor legibilidad/mantenimiento. Si está dentro del constructor, ¿debería ser antes o después de la llamada al InitializeComponent()?

Respuesta

5

Cuando está ejecutando el desarrollo de WinForm (a juzgar por la función InitializeComponent() mencionada), generalmente asigna el controlador utilizando Visual Studio. Busca las propiedades de su control, hace clic en el ícono del rayo para obtener la lista de todos los eventos, encuentra su evento y hace doble clic en él (para crear un nuevo manejador) o selecciona el manejador existente de la lista. Visual Studio agregará el cableado de esto en el código generado, para que no tenga que preocuparse por ello.

+0

Vi que aún podía hacer esto, pero también tengo clases de un archivo DLL que generan eventos y tengo que registrarme para estos a través de código. – themaninthesuitcase

+1

Si necesita registrarse para eventos de algunos objetos comerciales, lo mantendría separado de los eventos de UI (porque tienen un propósito completamente diferente). Lo ideal es hacerlo en las clases de lógica de negocios, si no es posible, por ejemplo, en p. Ej. Cargue el controlador de eventos de su formulario. – Grzenio

3

Siempre creo un método privado llamado Init() y lo coloco allí, y luego llamo a ese método desde el constructor o el controlador de evento Form_Load. Es semánticamente mejor, IMO, que hacerlo dentro del propio constructor. Y no desea colocarlo dentro de InitializeComponent(), porque la próxima vez que cambie algo en su diseñador es probable que elimine allí cualquier código agregado manualmente.

1

Depende, pero la mayoría de las veces, sí.

Use InitializeComponent cuando desee que el evento se enganche durante toda la duración del formulario (supongo que está hablando de formularios/UserControls/etc.). En otros casos, querrás un control más detallado cuando se maneje el evento.

Tenga en cuenta que querrá desenganchar todos estos eventos (usando la sintaxis = =) cuando esté desechando el formulario, o ya no quiera manejar el evento. Mantener a los delegados del controlador de eventos adjuntos es una de las fugas de memoria gestionadas más comunes.

+0

He notado que si uso el ícono de iluminación para generar un + = no, se genera - = correspondiente. ¿Dónde debería poner estos? Seguramente una vez que la referencia está fuera del alcance, el GC debe administrar este ? – themaninthesuitcase

+0

Debe anular el método de eliminación y desengánterlos. Suponiendo que sus componentes son autónomos (es decir, la ruta a las raíces de la GC no incluye ningún objeto que no haya salido del alcance), usted está en lo cierto: recibirá GC. Sin embargo, si utiliza controladores estáticos o expone estos controles donde otros eventos se adjuntan (pero no se desconectan), nunca "salen del alcance", lo que le proporciona la pérdida de memoria administrada. – micahtan

0

Si tiene el método InitializeComponent(), está utilizando el diseñador para que pueda enlazar eventos directamente en el diseñador si lo desea. Para hacer esto, haga clic en el ícono del rayo en la ventana de propiedades y verá una lista de todos los eventos para el objeto seleccionado. Puede escribir el nombre del evento allí y creará el código para usted.

Si no es seguidor del diseñador, agréguelo después de su llamada a InitializeComponent y asegúrese de desconectarlos cuando haya terminado (en Dispose()).

0

2 formas de hacerlo. Puedes crear tu propio método al que llamas en tu Constructor que a su vez crea el Manejador de eventos, o simplemente puedes colocarlos en tu Constructor. Probablemente sea una buena idea eliminar los manejadores de eventos en su código Finalizer/Destructor.

1

Do no agregue manualmente el código al método InitializeComponent(). Este método está generado por código, por lo que tan pronto como cambie su formulario, cualquier lógica que haya agregado manualmente a este método será borrada.

Normalmente agrego un método para manejar el evento Load del Formulario y coloco allí mis registros de eventos.

0

Lo colocaría después de InitializeComponent, ya que podría estar registrando eventos contra un control/objeto secundario, como un botón, y querrá asegurarse de que el objeto ya se haya creado.

Habrá casos en los que cablee eventos dinámicamente/condicionalmente en otros lugares, como en respuesta a algún otro evento.

2

veces Visual Studio desastre diseñador puede el código, por lo que agregar los controladores de eventos dentro InitializeComponent puede crear un dolor de cabeza, sería mejor hacerlo algo como esto

 
public Form1(){ 
    InitializeComponent(); 
    WireUpEvents(); 
} 

public void WireUpEvents(){ 
    this.fooEvent += new EventHandler(foo_handler); 
    .... etc .... 
} 

Y asegúrese de que se quita el controladores de eventos en función de botar el formulario también ...

 
public void UnWireEvents(){ 
    this.fooEvent -= new EventHandler(foo_handler); 
    .... etc .... 
} 

al diseñar el formulario, Visual Studio cambiará el código dentro del método InitializeComponent() situado en form.design.cs, por lo que es imperativ e que no edite manualmente este código ...

Cuestiones relacionadas