Soy nuevo en C# y Windows Form, pero si tengo un botón de radio y llamo radiobutton1.Checked = cierto, ¿hay alguna forma de que no se active el evento CheckedChange? Quiero distinguir entre el usuario que hace clic en el botón de radio y yo configurando el botón de radio programáticamente. es posible?Cuando configura la propiedad Controlada en un RadioBox, ¿puede suprimir el evento CheckChanged?
Respuesta
¿Por qué debería preocuparse por su código? ¿Quién consultó el botón de radio?
EDITAR: Hay formas de evitar esto (subclase, indicador), pero no. La única razón "de fiar" que se me ocurre para querer esto es evitar que ocurra algún efecto secundario cuando el valor se muestra inicialmente (programáticamente), e incluso eso es sospechoso. Repensar el efecto secundario, ¿realmente pertenece al evento de cambio o al compromiso?
Más información uno por qué/qué ayudaría. En la superficie, esto parece un error de diseño.
Creo que quiere hacer cosas diferentes según los usuarios que hagan clic y cambien el código subyacente. –
Tienes razón. – genomess
entiendo que es lo que quiere el OP; no entiendo por qué, y sospecho un error de diseño en la necesidad –
Una forma (hacker) que hacerlo sería una subclase RadioButton
y anular el método virtual OnCheckChanged
, suprimiendo el caso si la propiedad Checked
se ha establecido mediante programación.
Sin embargo, dado que los botones de opción pertenecen a un grupo, el evento siempre se dispara de a pares (por ejemplo para la desactivación, uno para la verificación). Por lo tanto, querrá suprimir el evento para el grupo completo cuando elige el botón seleccionado mediante programación. He aquí un ejemplo de implementación:
public class CustomRadioButton : RadioButton
{
private bool _suppressCheckedEvent;
public void SetChecked(bool value, bool suppressCheckedEvent)
{
if (!suppressCheckedEvent)
Checked = value;
else
{
SetSupressModeForGroup(true);
Checked = value;
SetSupressModeForGroup(false);
}
}
private void SetSupressModeForGroup(bool suppressCheckedEvent)
{
foreach (var crb in Parent.Controls.OfType<CustomRadioButton>())
crb._suppressCheckedEvent = suppressCheckedEvent;
}
protected override void OnCheckedChanged(EventArgs e)
{
if (!_suppressCheckedEvent)
base.OnCheckedChanged(e);
}
}
En esta implementación, el cambio del estado marcada por la propiedad Checked
siempre se disparará el evento. Cuando llama al método SetChecked
, tiene la opción de suprimir el evento.
Aquí hay un método sencillo de usar el evento cuando te da la gana.
private bool SuppressRadioButton1Event { get; set; }
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
if (!this.SuppressRadioButton1Event)
{
MessageBox.Show("Not suppressed!");
}
}
private void button1_Click(object sender, EventArgs e)
{
this.SetRadioButton1(false);
}
private void SetRadioButton1(bool checkedOn)
{
this.SuppressRadioButton1Event = true;
radioButton1.Checked = checkedOn;
this.SuppressRadioButton1Event = false;
}
+1 Tengo que admitir que esta forma de 'marcar 'es mejor que la mía :) –
Una forma muy fácil:
public void radio_OnCheckChanged(object sender, EventArgs e)
{
RadioButton r = sender as RadioButton;
bool isUserChange = r.Tag.Equals(1);
if (isUserChange) blabla
else blabla
r.Tag = null;
}
public void MyMethod()
{
radio1.Tag = 1;
radio.Checked = true;
}
Se puede utilizar cualquier tipo de flag
el que los usuarios no pueden hacer por su clicking.But se puede hacer a través de su código.
Establecer la etiqueta en otro marcador en lugar de nulo evitará la excepción de uso nulo. – amalgamate
Deje de intentar rechazar el diseño del evento CheckedChanged
. Se supone específicamente que debe incluir cambios programáticos.
Si desea cambios activados por el usuario y no cambios programáticos, use el evento Click
en su lugar. (Puede pensar que no desea limitarse a clics del mouse, no se preocupe, hay un evento MouseClick
para eso, Click
incluye también cambios en el teclado)
Esto no dispara para un 'RadioButton' cuando pasa de un estado marcado a un estado no verificado. – Ani
@Ani: genomess dijo que quería un evento para disparar solo cuando el usuario hace clic en el botón. Estoy bastante seguro de que el botón de opción nunca se desactiva si el usuario hace clic en él. –
Bien, es suficiente. – Ani
Puede intentar adjuntar el evento mediante programación . En función de la configuración de mi aplicación, verifico varios botones de opción pero no deseo disparar eventos. Para adjuntar un evento mediante programación:
chbOptionX.CheckedChanged + = new System.EventHandler (this.chbShowStockBySizeAndColor_CheckedChanged);
Pero aún así no se puede distinguir entre los cambios inducidos por el colocador y el clic cuando se dispara el evento. – DerMike
- 1. Prueba de unidad controlada por evento javascript
- 2. Evento detectar cuando se cambió la propiedad css utilizando Jquery
- 3. La propiedad EntityKey sólo se puede ajustar cuando el valor actual de la propiedad es nulo
- 4. jQuery: ¿Suprimir `click` cuando` dblclick` es inminente?
- 5. Enlace de la propiedad controlada de un CheckBox dentro de un TemplateItem
- 6. Levante un evento cuando la propiedad se modificó usando la Reflexión
- 7. Enganche en un evento onClick sin usar la propiedad HTML
- 8. Suprimir el error "extra"; "en GCC cuando -pedantic está en
- 9. Excepción no controlada en la Lista Ordenar
- 10. ¿Cómo se configura StyleCop para suprimir las advertencias en el código generado?
- 11. ¿Hay un evento que se activa cuando se ha establecido un enlace en una propiedad?
- 12. herencia .NET: suprimir una propiedad de la clase base
- 13. XAML: La propiedad 'Recursos' se configura más de una vez
- 14. SecurityException fue controlada cuando se utiliza el almacenamiento aislado
- 15. ¿Cómo se configura la reconexión en socket.io?
- 16. El enlace solo se puede establecer en DependencyProperty de DependencyObject - cuando la propiedad se reemplaza por
- 17. ¿Cómo se puede suprimir un recibo de lectura?
- 18. ¿Qué evento necesito suprimir para detener IE de "Dinging" cuando presiono enter en un cuadro de texto?
- 19. Delphi: configura el formulario para que no se centre en ningún componente cuando muestra
- 20. ¿Cómo puede el código en un bloque "try ... catch" arrojar una excepción no controlada?
- 21. ¿Configura manualmente un PageCount de GridView cuando DataSource no devuelve el conjunto de resultados completo?
- 22. Django Excepción no controlada
- 23. ¿Puedes suprimir los mensajes de activos cuando sigues el desarrollo.log?
- 24. Log4Net no puede encontrar el nombre de usuario% propiedad cuando nombro el archivo en mi appender
- 25. No se puede leer la propiedad booleana en JSP EL
- 26. Cómo suprimir la validación cuando no se ingresa nada
- 27. ¿Por qué se puede ejecutar el evento transitionend cuando finaliza la transición de elementos del elemento?
- 28. Evento o propiedad de pantalla apagada en el iPhone
- 29. Suprimir PostSharp Multicast con el atributo
- 30. no se puede disparar el evento de pulsación de tecla cuando presiono la tecla borrar
Esto me parece un problema de diseño. ¿Qué comportamiento estás tratando de definir? – womp
Sí, probablemente pueda diseñar alrededor, pero estoy acostumbrado a que los controles no envíen eventos si se llama a SetValue. wxWidgets funciona así y hace la vida más fácil.Ok, parece que la respuesta es no; evento está activado y no puede ser suprimido. Gracias. – genomess