2012-08-29 25 views
17

Supongamos que tengo un proyecto de WinFoms. Solo hay un botón (por ejemplo, button1).Evento de control de desencadenamiento programáticamente

La pregunta es: ¿es posible desencadenar el evento ButtonClicked mediante código sin realmente hacer clic en él?

+2

, ya que esta pregunta todavía está viva (incluso tengo cierta reputación :), me gustaría hacer aquí una pequeña advertencia: si crees que tienes que hacer algo como esto en tu código, casi por Seguro que estás haciendo algo mal. Yo también. Probablemente tengas un mal diseño y es mejor que pases un tiempo reconsiderando lo que estás haciendo y por qué. – steavy

+0

De hecho, creo que es una pregunta relevante, quería crear un menú emergente que incluyera genéricamente todos los elementos de una barra de herramientas y lo que el menú contextual ya tenía, el método PerformClick mencionado por itsme86 ayudó :-) – s1cart3r

Respuesta

29

Los controles de botón tienen un método PerformClick() al que puede llamar.

button1.PerformClick(); 
+0

esto es bueno para hacer clic , pero ¿y si necesito otro evento? – steavy

+2

En general, solo tendrá que llamar a sus controladores de eventos de forma manual. por ejemplo, button1_Shown (button1, EventArgs.Empty); – itsme86

9

Sólo puede llamar a la función de controlador de eventos directamente y especificar null para el emisor y EventArgs.Empty para los argumentos.

void ButtonClicked(object sender, EventArgs e) 
{ 
    // do stuff 
} 

// Somewhere else in your code: 
button1.Click += new EventHandler(ButtonClicked); 

// call the event handler directly: 
ButtonClicked(button1, EventArgs.Empty); 

O, más bien, que movería la lógica fuera del evento ButtonClicked en su propia función, y luego el controlador de eventos y el otro código que tiene a su vez llamar a la nueva función.

void StuffThatHappensOnButtonClick() 
{ 
    // do stuff 
} 

void ButtonClicked(object sender, EventArgs e) 
{ 
    StuffThatHappensOnButtonClick(); 
} 

// Somewhere else in your code: 
button1.Click += new EventHandler(ButtonClicked); 

// Simulate the button click: 
StuffThatHappensOnButtonClick(); 

Este último método tiene la ventaja de permitirle separar su negocio y la lógica de la IU. Realmente nunca debería tener ninguna lógica comercial en los controladores de eventos de control.

1
button1.PerformClick(); 

Pero si usted tiene que hacer algo como esto tal vez es mejor mover el código que tiene con el evento en un nuevo método?

4

Sí, simplemente llame al método de la misma manera que llamaría a cualquier otro. Por ejemplo:

private void btnSayHello_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Hello World!"); 
    } 

    private void btnTriggerHello_Click(object sender, EventArgs e) 
    { 
     btnSayHello_Click(null, null); 
    } 
+2

No necesito llamar al método de los controladores. Necesito activar el evento. Se llama al controlador después del evento desencadenante. – steavy

17

El marco .NET utiliza un patrón en el que para cada evento X hay un método que eleva protected void OnX(EventArgs e) {} caso X. Vea esto Msdn article. Para plantear un evento desde fuera de la clase de declaración, deberá derivar la clase y agregar un método de envoltura pública. En el caso de Button que se vería así:

class MyButton : System.Windows.Forms.Button 
{ 

    public void ProgrammaticClick(EventArgs e) 
    { 
     base.OnClick(e); 
    } 

} 
0

utilizar un bucle para llamar al evento Button_Click

private void btnadd_Click(object sender, RoutedEventArgs e) 
{ 
    for (int i = 0; i <= 2; i++) 
     StuffThatHappensOnButtonClick(); 
} 


void StuffThatHappensOnButtonClick() 
{ 
    ........do stuff 
} 

asumimos al menos una vez que necesite hacer clic en el botón

+2

vamos amigo! ¿Cómo está relacionado esto con la pregunta? – chouaib

1

Por qué no solo pones tu código de evento en un Método. Luego haga que el evento ejecute el método. De esta forma, si necesita ejecutar el mismo código que el evento, puede hacerlo, pero simplemente llamando al "Método".

void Event_Method() 
{ 
    //Put Event code here. 
    MessageBox.Show("Hello!"); 
} 

void _btnSend_Click(object sender, EventArgs e) 
{ 
    Event_Method(); 
} 

void AnotherMethod() 
{ 
    Event_Method(); 
} 

¿Tiene sentido? Ahora, el evento "Hacer clic" Y en cualquier parte del código, puede activar el mismo código que el evento "Hacer clic".

No desencadenar el evento, llame al método que llama el evento. ;)

Cuestiones relacionadas