¿Qué hace que no todos los eventos estén disponibles en el diseñador y cómo puedo generar controladores rápidamente en C# como en VB.NET?


En el diseñador de formularios de Visual Studio, puede agregar un controlador de eventos en la ventana Propiedades en la lista "Eventos" haciendo doble clic en él. También puede agregar un controlador de eventos, al menos en VB.NET -en la vista de código seleccionando el elemento "Eventos" asociado en el menú desplegable de la izquierda y luego el evento deseado en el menú desplegable de la derecha. Mi pregunta es: ¿cómo es que algunos eventos que solo están disponibles a través de la última técnica y no la primera? Por ejemplo, el evento HandleCreated está disponible en la vista de código:

introduzca la descripción de la imagen aquí

Pero no en el diseñador:

introduzca la descripción de la imagen aquí

Esto está bien en VB.NET porque siempre puedo usar la primera técnica para generar rápidamente los controladores de eventos. Sin embargo, en C#, la primera técnica no es posible, pero el problema sigue existiendo; es decir, algunos eventos no están presentes en la lista diseñador en la ventana Propiedades. La única otra forma que conozco de crear el controlador de eventos es agregarlo manualmente, lo que incluye el cableado manual del evento handler.

¿Hay algo técnico que haga que algunos eventos falten en la lista de eventos del diseñador en la ventana Propiedades? Dado que eso es cierto, ¿cómo puedo generar rápidamente controladores de eventos en C# como puedo en VB.NET?

Author: rory.ap, 2015-03-26

4 answers

Bueno, está oculto intencionalmente. Si nos fijamos en la clase Control, HandleCreated el evento está marcado con Browsable(false), lo que significa no mostrarlo en la ventana de propiedades.

[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Advanced)]
public event EventHandler HandleCreated;

Si me preguntas por qué? No se la respuesta. Es una decisión de diseño, que cualquiera de la persona del equipo de diseño tiene que responder a eso.

Mi conjetura es que esconden eventos que no son de mayor importancia. ¿Cuántas veces necesitas suscribirte HandleCreated? Normalmente se suscribe al evento Load.

Algunos otros buenos ejemplos de los eventos que entran en la misma categoría son ControlAdded, ControlRemoved etc. Como puede ver, estos no son muy importantes, están ocultos del diseñador.

Cómo suscribir fácilmente el evento en el editor de C # como VB.net?

No se puede obtener el cuadro combinado para eventos como se obtiene para VB.net; Lo más cercano que puedes obtener es el soporte ide que puede autocompletar por ti (que ya se menciona en la respuesta de @HenkHolterman; ahora eliminado).

Escriba this.HandleCreated +=, luego tab , tab .

Ide conectará los eventos por ti.

 27
Author: Sriram Sakthivel,
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
2015-03-28 08:42:04

El VB.NET y los IDEs de C# solo se ven superficialmente iguales. Trabajaban con una especificación de apariencia bastante decente. Pero ahí es donde se detiene el parecido, fueron creados por dos grupos muy diferentes en Microsoft y tienen bases de código drásticamente diferentes. De lo contrario, una estrategia de supervivencia para las grandes compañías de software, los grandes grupos no funcionan.

Lo más importante, tenían metas dramáticamente diferentes. El equipo de C # tuvo el lujo de empezar desde cero, siempre es bueno cuando no tienes a nadie que mantener feliz y no tienes equipaje que cargar. No es así para el VB.NET equipo, Visual Basic ha sido un producto popular durante mucho tiempo con un fuerte soporte IDE que se remonta a 25 años. Lo más importante para ellos era devolver a sus clientes una experiencia familiar, VB.NET ya era un gran trastorno que era muy controvertido.

La forma en que esos dos cuadros combinados en la parte superior de la ventana de edición se fundieron en piedra de roca de granito. Nunca se filtraron cualquier cosa antes. Si el VB.NET el programador escribió un controlador de eventos para un evento y espera siempre encontrarlo de vuelta en el combobox. Funciona al revés también, el VB.NET IDE esconde mucha información. Como no mostrar los archivos de origen generados automáticamente en la ventana del Explorador de soluciones.

No haga demasiadas suposiciones sobre cómo debería funcionar, es probable que adivine mal. Y tienen pocas opciones para hacer algo al respecto.

 16
Author: Hans Passant,
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
2015-03-27 16:51:38

Imagine que tiene un control de usuario que tiene propiedades UI y no UI. Debe decorar las propiedades que no son de la interfaz de usuario con Browsable(False) para que no estén disponibles a través de la ventana de propiedades.

 1
Author: Rohit,
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
2015-03-29 07:38:55

Para responder a su segunda pregunta, no puede crear controladores de eventos rápidamente como lo haría en VB.NET. Esta es una de las diferencias de VB.NET a C # más allá de la sintaxis.

En VB.NET, puede decorar un campo con el modificador WithEvents , que es un requisito para crear "controladores de eventos rápidos". Esto se traduce en una nueva propiedad que hará todas las cosas de registro de eventos para usted. This WithEvents is implicitly created for the this (or Me) pointer as well. C# no tiene esta característica de sintaxis y, por lo tanto, no es posible, por lo que tiene que hacerlo manualmente. Después de todo, la diferencia entre VB.NET y C# nunca ha sido solo sintaxis, solo casi solo sintaxis:)

Supongo que la razón es que C # fue diseñado para restringir la cantidad de palabras clave a un mínimo, mientras que Microsoft nunca dudó en agregar más palabras clave a VB.NET. Si considera los elementos de sintaxis LINQ, hay un par de palabras clave más recientemente introducidas en VB.NET que en C#.

 0
Author: Georg,
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
2015-03-29 07:40:21