2010-07-29 16 views
8

Tengo algunos eventos que creé yo solo y me preguntaba cómo criarlos cuando quisiera.Levantar eventos personalizados en C# WinForms

Probablemente el diseño de mi aplicación también esté mal, podría echarle un vistazo si lo desea.

Ésta es la estructura

ProgramContext 
- Form MainWindow 
    + Control TextBox 
    + Control Button 
    + ... 

En este caso, el MainWindow.TextBox mantiene cierta información que se actualiza muy a menudo en tiempo de ejecución. Por lo tanto, de alguna manera necesito que se actualice cuando quiero (para que pueda volver a cargar sus datos desde la base de datos, donde está almacenado)

Intenté conectar un EventHandler a su Validating -Event, pero eso no parecía para hacer el truco

Así que, básicamente, tienen un método que vuelve a cargar los datos en ProgramContext

DataTable table = _adapter.GetData(); 
foreach (DataRow row in table.Rows) 
{ 
    MainWindow.TextBox.Text += table.Text.ToString(); 
} 

que hay que hacer cada vez que se ejecuta otro método (que escribe nuevos datos en table).

¿Alguna idea?

Respuesta

13

Editar: Parece que su pregunta es más acerca de conectarse a un evento específico, pero FWIW a continuación es cómo disparar eventos personalizados en general.

Manejo del cuadro de texto Evento

Cambiado Por lo que entiendo, quieres una parte externa para supervisar eventos generados a partir de un cuadro de texto en un formulario y luego volver a cargar los datos en otra forma?

Una rápida y sucia sería hacer el público Formulario cuadro de texto y luego otros podrían suscribirse a este evento

MainForm.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 

O, en las versiones más recientes de C#:

MainForm.textBox1.TextChanged += this.textBox1_TextChanged; 

la adición de su propio evento personalizado

Otra manera más limpia sería raise a custom event, - por ejemplo MyDataChangedEvent a continuación. Esto le permitirá abstraer el hecho de que los cambios provienen de un cuadro de texto.

// Assuming you need a custom signature for your event. If not, use an existing standard event delegate 
public delegate void myDataChangedDelegate(object sender, YourCustomArgsHere args); 

// Expose the event off your component 
public event myDataChangedDelegate MyDataChangedEvent; 

// And to raise it 
var eventSubscribers = MyDataChangedEvent; 
if (eventSubscribers != null) 
{ 
    eventSubscribers(this, myCustomArgsHere); 
} 

También puede buscar en el bloque y Smart Client Software Factory de aplicaciones compuestas Ent Lib - esto tiene un mecanismo sub evento de corretaje/pub muy flexible para sincronizar en "SmartParts" interfaz de usuario (controles, forma diálogos, etc.) en una forma de acoplamiento suelto.(CAB ahora está muy anticuado).

+3

En su ejemplo, en lugar de declarar un nuevo delegado, sería más claro para utilizar sólo el genérico '' EventHandler' como en acto público manejador de sucesos MyEvent' –

+0

También probé enganchando a 'TextChanged', pero que terminará en un bucle infinito, ya que quiero cambiar el texto dentro del EventHandler –

+1

Puede cambiar el texto dentro del controlador, pero debe eliminar el evento mientras dure el método.Puedes hacerlo así: llama a 'this.TextChanged - = SomeClassName_TextChanged' para deshabilitar el evento para esta persona que llama, haz algunas cosas en el método y luego llama a' this.TextChanged + = SomeClassName_TextChanged' para reactivar el evento. – Nebula

Cuestiones relacionadas