.net - radiobutton - radio button visual basic propiedades
Cómo evitar el agrupamiento automático de contenedor de botón de Windows Forms (2)
El fondo
En los botones de radio .NET Windows Forms (2.0) se agrupan automáticamente por su control de contenedor, ya sea un Formulario, un Panel o un GroupBox.
Eso significa que cuando selecciona un botón de opción, todos los demás botones de opción en el mismo contenedor cambian automáticamente a estado desactivado.
Ahora, considere el siguiente diseño de formulario:
MUST HAVE NICE TO HAVE DESCRIPTION
--------- ------------ -----------------------------------------------
[ ] [ ] The gizmo works
[ ] [ ] The gizmo works beautifully
[ ] [ ] The gizmo works amazingly and makes you breakfast
[ ] [ ] The gizmo comes with a pony
- Cada
''[ ]''
es un botón de radio. - Se le pide al usuario que elija la respuesta requerida en la columna uno, y la opción (respuesta deseada, el mejor de los casos) en la columna 2.
Como puede ver, los botones de radio se deben agrupar por columna: la selección de uno de los radios debería borrar el resto de la columna, pero no debería tener ningún efecto en la otra columna.
El problema
Básicamente, el problema es que esta es una forma generada dinámicamente.
- El número de filas en el diseño es dinámico y se carga desde una definición de formulario configurable.
- El texto descriptivo no se conoce hasta que el tiempo de ejecución y las longitudes varían mucho (algunos pueden tener solo un par de palabras, y algunas otras una docena de líneas).
- El diseño no puede rediseñarse. Esto proviene de la familiaridad de los usuarios (no técnicos) con la versión en papel de este formulario que ha estado en uso durante años. Este formulario también se imprimirá e incluso si modifiqué el sistema de entrada en mi formulario, eso significaría codificar otra versión para imprimir con el diseño ''antiguo''.
Lo que probé y no funcionó
Primero traté de implementar esto como un diseño generado dinámicamente usando tres paneles, uno para cada columna, por lo que la agrupación automática del botón de radio funcionaría muy bien. Y lo hizo.
Pero los problemas de diseño relacionados con la alineación horizontal entre los botones de radio y su texto me acaban de matar. El tamaño del texto no se conoce hasta el tiempo de ejecución y las líneas de texto se pueden ajustar (a veces varias veces para cada elemento). A veces se alinea correctamente, otras veces no. Estoy a punto de comenzar a depurar esto, pero estoy pensando si tal vez cambiar esta implementación de tres paneles es una mejor opción.
Lo que trato de hacer
Me gustaría rediseñar el diseño mediante el uso de TableLayoutPanel
con tres columnas para simplificar los problemas relacionados con la alineación, pero eso significa que no puedo usar el botón de TableLayoutPanel
automático agrupando por contenedor la "función".
EDITAR:
Como sugirió Gerrie, otra opción de diseño es tener cada línea implementada como un control de usuario y usar un panel de diseño de flujo.
Eso significa, una vez más, que podría querer usar controles para el diseño, pero no para la agrupación de botones de radio.
Necesitaría obtener grupos de botones de radio verticales a pesar de usar controles de usuario horizontales
/EDITAR
Lo que intento preguntar
Necesito punteros y sugerencias sobre cómo controlar manualmente la agrupación de los botones de radio. Realmente no me importa subclasificar la clase RadioButton
si es necesario.
Específicamente, ¿existe alguna forma "canónica" o conocida de subclasificar "RadioButton" o bajar hasta las API de Win32, de modo que cada vez que se verifique el control (utilizando el mouse, el teclado Enter, la barra espaciadora y de cualquier otra manera) que no podría ser consciente de seleccionarlos) ¿Puedo atrapar el evento y actualizar manualmente el estado de cada uno de los demás controles en mi formulario y de modo que se sepa que la función de agrupación automática está "desactivada"? Me temo que la implementación también está relacionada con los contenedores, y ¿podría ser forzado a subclasificar el Panel ?.
¿Cómo funciona la agrupación ''magia'' en Windows Forms?
Cada solución que he encontrado en Google que implementa grupos de botones de opción personalizados o ''listas de botones de radio'' se basa de alguna manera en el uso de un contenedor para el grupo. ¿Se pueden evitar los contenedores? ¿Si es así, cómo?.
Una solución temporal (léase: desordenado hack ) que encontré es que estoy poniendo todos y cada botón de radio en su propio panel pequeño. Entonces ninguna agrupación ocurre entre ninguno de ellos. Estoy escuchando cada botón checked
eventos y actualizando los apropiados en consecuencia.
Todavía creo que es excesivo tener tantos paneles, y si alguien tiene una solución más limpia, me encantaría escucharla.
(OK, lo siento por responder mi propia pregunta. Sabes que cuando te tomas el tiempo para explicar algo, empiezas a ver el problema como una luz diferente).
Yo buscaría una solución simple y directa. Por ejemplo, un control personalizado que representa una línea (por lo tanto, dos botones de opción y una etiqueta).
EDITAR: OK, creo que entiendo tu requerimiento ahora. ¿No puedes tener dos colecciones de botones de radio: los de la columna A y los de la columna B?
Cuando su formulario esté dibujado, agréguelos a dos List <RadioButton> o lo que sea y agréguelos a dos eventos separados: columnARBChecked, columnBRBChecked. Cuando se dispara uno de los eventos, puede invocar un poco de lógica para marcar / desmarcar el resto de los botones de radio como lo desee.