2012-07-12 15 views
5

Estoy trabajando con C# WinForm. Tiene más de una docena de cuadros de texto, cuadros combinados y casillas de verificación. Winform muestra la información que se recupera de una base de datos. Hay un botón de guardar en el formulario que está deshabilitado. Deseo poder habilitarlo cuando se modifique cualquiera de los cuadros de texto/cuadros combinados/casillas de verificación.Haga que se active el evento cada vez que se realicen cambios en cuadros de texto, cuadros combinados, etc. dentro del formulario

¿Existe un modo fácil de hacerlo sin agregar controladores de eventos por separado para cada uno de estos elementos?

+0

posible duplicado de [Cómo detectar los cambios en cualquiera de control de la forma en C#?] (Http://stackoverflow.com/questions/3571722/how-to-detect-changes-in-any-control -of-the-form-in-c) –

+0

No tiene sentido programarlo de esa manera. Si el usuario verifica algo y luego lo desmarca nuevamente, ¿planea desactivar nuevamente el botón? Después de todo, nada cambió. – LarsTech

Respuesta

5

Aquí hay suficiente para que te vean. Puede necesitar agregar foreach bucles adicionales para otros tipos de control según sea necesario. Lo bueno es que solo necesita unas pocas líneas de código por tipo de Control, no por instancia, con este enfoque.

private void addHandlers() 
{ 
    foreach (TextBox control in Controls.OfType<TextBox>()) 
    { 
     control.TextChanged += new EventHandler(OnContentChanged); 
    } 
    foreach (ComboBox control in Controls.OfType<ComboBox>()) 
    { 
     control.SelectedIndexChanged += new EventHandler(OnContentChanged); 
    } 
    foreach (CheckBox control in Controls.OfType<CheckBox>()) 
    { 
     control.CheckedChanged += new EventHandler(OnContentChanged); 
    } 
} 

protected void OnContentChanged(object sender, EventArgs e) 
{ 
    if (ContentChanged != null) 
     ContentChanged(this, new EventArgs()); 
} 

public event EventHandler ContentChanged; 

Después de modificar el método addHandlers para apoyar a todos los controles, y decir que es después de añadir todos los controles a su forma, sólo tiene que suscribirse al evento ContentChanged para hacer lo que podía suceder en cualquier momento algo en la forma cambió (es decir, habilitar/deshabilitar un botón de guardar).

+0

+1 a la mejor respuesta hasta ahora –

0

Puede escribir un controlador de eventos de propósito general que maneje el evento para todos ellos, pero ay, no, no hay forma de autogenerar controladores de eventos en Visual Studio (ni debería haberlos).

0

Puede tener todos los eventos conectados a un manejador, simplemente haga que todos invoquen la misma función, allí tiene un indicador bool mbSomethingChanged = true y habilite el botón guardar. Verifique el indicador en el formulario cerrar, si desea alertar al usuario para guardar.

2

Tienes que pasar por los controles y adjuntar evento de cambio a cada control. Este article discute la situación similar.

private void AssignHandlersForControlCollection(
     Control.ControlCollection coll) 
    { 
     foreach (Control c in coll) 
     { 
      if (c is TextBox) 
       (c as TextBox).TextChanged 
       += new EventHandler(SimpleDirtyTracker_TextChanged); 

      if (c is CheckBox) 
       (c as CheckBox).CheckedChanged 
       += new EventHandler(SimpleDirtyTracker_CheckedChanged); 

      // ... apply for other desired input types similarly ... 

      // recurively apply to inner collections 
      if (c.HasChildren) 
       AssignHandlersForControlCollection(c.Controls); 
     } 
    } 
Cuestiones relacionadas