2009-02-23 15 views
7

El fondo¿Cómo evitar Windows Forms de radio contenedor botón agrupación automática

En .NET Windows Forms (2.0) botones de radio se agrupan automáticamente por el control contenedor, si se trata de un formulario, panel o 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 no verificado.

Ahora, consideremos el siguiente diseño del 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
  • El usuario elegir el requerido respuesta en la columna uno, y el opcional (deseada, el mejor de los casos la respuesta) en la columna 2.

Como se puede ver, los botones de radio debe agruparse por columna: la selección de una de las 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 generado 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 de la descripción no se conoce hasta que el tiempo de ejecución y la longitud varíen mucho (algunos pueden tener solo un par de palabras y algunas otras una docena de líneas).
  • El diseño no se puede rediseñar. 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 he intentado y no funcionó

primera vez que 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 botón de opción funcionaría igual multa. Y lo hizo.

Pero los problemas de diseño relacionados con la alineación horizontal entre los botones de radio y su texto me están acabando. 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 estoy tratando de hacer

me gustaría rediseñar el diseño mediante el uso de un TableLayoutPanel con tres columnas con el fin de simplificar las cuestiones relacionadas con la alineación, pero eso significa que no puedo usar la radio automática botón agrupar por contenedor "característica".

EDIT:

Como sugirió Gerrie, otra opción de diseño es que cada línea implementado como un control de usuario y el uso de 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 agrupar botones de opción.

que iba a necesitar para conseguir grupos de botones de radio verticales a pesar de utilizar el usuario controla horizontal

/EDIT

Lo que estoy tratando de pedir

necesito consejos y sugerencias sobre cómo para controlar manualmente la agrupación de los botones de radio. Realmente no me importa subclasificar la clase RadioButton si es necesario.

Específicamente, ¿hay alguna forma 'canónica' o conocida de subclasificar 'RadioButton' o bajar hasta las API de Win32, de modo que cada vez que se compruebe el control (usando el mouse, teclado Entrar, barra espaciadora, y de cualquier otra forma que yo no pueda saber si los selecciono) Puedo atrapar el evento y actualizar manualmente el estado de cada uno de los otros controles en mi formulario y de manera que la función de agrupación automática es conocida como '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 personalizados de botones de radio 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?.

Respuesta

6

Una solución temporal (léase: truco sucio) que encontré es que estoy poniendo cada y cada botón de radio en su propio panel pequeño. Entonces ninguna agrupación ocurre entre ninguno de ellos. Estoy escuchando cada uno de los eventos de los botones checked y actualizo los correspondientes según corresponda.

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 a mi propia pregunta. Usted sabe que cuando se toma el tiempo para explicar algo que comienza a ver el problema que una luz diferente.)

+0

Si va con esta solución, sería un buen momento para crear un botón de radio propio que no tenga que estar en un panel. Y cuando lo haga, agregue una propiedad opcional GroupID, que se reenvía cuando se alterna. – Stefan

+0

Nuevamente, gracias por su ayuda Stefan. Por cierto, ya había hecho una clase IndependentRadioButton pero aún no se me había ocurrido agregar la propiedad GroupId allí mismo. Suena bien. –

+0

Verifique la edición de mi respuesta para obtener más ideas. –

1

Me gustarí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).

EDIT: OK, creo que entiendo su requisito ahora. ¿No puedes tener dos colecciones de botones de radio: los de la columna A y los de la columna B?

Cuando se dibuja su formulario, 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.

+0

Eso funcionaría en lugar de TableLayoutPanel con fines de diseño, Por supuesto. El problema con esta solución es que los botones dentro del control del usuario aún estarían agrupados dentro del control del usuario.Así que tendría tantos grupos como instancias de control de usuario en lugar de 2 grupos (uno para cada columna). –

+0

Entonces me temo que no entiendo completamente tu requerimiento. ¿Quieres agrupar horizontalmente? ¿Por qué quieres paneles verticales también? ¿Por qué no puedes simplemente recorrer la colección de controles personalizados y leer qué botón de opción está marcado allí? –

+0

Lo siento, voy a editar la pregunta para aclarar que, de hecho, la agrupación horizontal (eso es lo que sucedería de manera predeterminada) no es lo que necesito, sino que es una agrupación vertical. Gracias. –

Cuestiones relacionadas