Usando WinForms; ¿Existe una mejor manera de encontrar el RadioButton marcado para un grupo? Me parece que el código siguiente no debería ser necesario. Cuando marca un RadioButton diferente, entonces sabe cuál desmarcar ... así que debería saber cuál está marcado. ¿Cómo extraigo esa información sin hacer muchas declaraciones if (o un cambio)?
RadioButton rb = null;
if (m_RadioButton1.Checked == true)
{
rb = m_RadioButton1;
}
else if (m_RadioButton2.Checked == true)
{
rb = m_RadioButton2;
}
else if (m_RadioButton3.Checked == true)
{
rb = m_RadioButton3;
}
c#
.net
winforms
radio-button
Porra
fuente
fuente
Respuestas:
Podrías usar LINQ:
Tenga en cuenta que esto requiere que todos los botones de opción estén directamente en el mismo contenedor (por ejemplo, Panel o Formulario) y que solo haya un grupo en el contenedor. Si ese no es el caso, puede hacer
List<RadioButton>
s en su constructor para cada grupo, luego escribirlist.FirstOrDefault(r => r.Checked)
.fuente
s.FirstOrDefault
en lugar delist.FirstOrDefault
en el segundo párrafo de su respuesta?s
es una pluralización, no un nombre de variable.Puede conectar los CheckedEvents de todos los botones contra un controlador. Allí puede obtener fácilmente la casilla de verificación correcta.
fuente
Para aquellos sin LINQ:
fuente
El OP quería obtener el RadioButton marcado POR GRUPO. Si bien la respuesta de @SLaks es excelente, realmente no responde a la pregunta principal del OP. Para mejorar la respuesta de @SLaks, simplemente lleve el LINQ un paso más allá.
Aquí hay un ejemplo de mi propio código de trabajo. Según WPF normal, mis RadioButtons están contenidos en un
Grid
(llamado "myGrid") con un montón de otros tipos de controles. Tengo dos grupos RadioButton diferentes en la cuadrícula.Para obtener el RadioButton marcado de un grupo en particular:
Si su código tiene la posibilidad de que no se verifique ningún RadioButtons, entonces use
SingleOrDefault()
(Si no estoy usando botones de tres estados, siempre configuro un botón "IsChecked" como selección predeterminada).fuente
.Where(r => r.GroupName == "GroupName" && r.IsChecked == true)
porquer.IsChecked
es una propiedad bool anulable.Puede utilizar el evento CheckedChanged para todos sus RadioButtons.
Sender
serán los RadioButtons no marcados y marcados.fuente
Puede utilizar un método de extensión para iterar la colección Parent.Controls de RadioButton. Esto le permite consultar otros RadioButtons en el mismo ámbito. Usando dos métodos de extensión, puede usar el primero para determinar si algún RadioButton del grupo está seleccionado y luego usar el segundo para obtener la selección. El campo Etiqueta de RadioButton se puede utilizar para mantener un Enum para identificar cada RadioButton en el grupo:
Aquí hay un patrón de uso típico:
fuente
Además del cableado CheckedChangedEvent, se podría usar la propiedad "Etiqueta" de los controles para distinguir entre los botones de opción ... una alternativa (código espagueti) sería la propiedad "TabIndex"; P
fuente
A veces, en situaciones como esta, extraño mi juventud, cuando Access era mi veneno preferido, y podía darle a cada botón de radio de un grupo su propio valor.
Mi truco en C # es usar la etiqueta para establecer el valor, y cuando hago una selección del grupo, leo el valor de la etiqueta del botón de radio seleccionado. En este ejemplo, directionGroup es el grupo en el que tengo cuatro cinco botones de radio con "Ninguno" y "NE", "SE", "NW" y "SW" como etiquetas en los otros cuatro botones de radio.
Usé proactivamente un botón para capturar el valor del botón marcado, porque al asignar un controlador de eventos a todos los eventos CHeckCHanged de los botones, CADA botón se dispara, porque cambiar uno los cambia todos. Entonces, el valor de remitente es siempre el primer RadioButton del grupo. En su lugar, utilizo este método cuando necesito averiguar cuál está seleccionado, con los valores que quiero recuperar en la propiedad Etiqueta de cada RadioButton.
FYI, he probado y utilizado esto en mi trabajo.
Joey
fuente
si quieres guardar la selección en un archivo o cualquier otra cosa y llamarla más tarde, aquí lo que hago
entonces llámalo con
fuente
Si desea obtener el índice del botón de opción seleccionado dentro de un control, puede usar este método:
Ejemplo de uso:
El código no está tan bien probado, pero parece que el orden del índice es de izquierda a derecha y de arriba a abajo, como cuando se lee un texto. Si no se encuentra ningún botón de opción, el método devuelve -1.
Actualización: resultó que mi primer intento no funcionó si no hay un botón de opción dentro del control. Agregué un bloque de prueba y captura para solucionarlo, y el método ahora parece funcionar.
fuente
El GroupBox tiene un evento Validado para este propósito, si está usando WinForms.
fuente
Para desarrolladores que usan VB.NET
fuente