2012-08-29 13 views
17

Załóżmy, że mam projekt WinFoms. Jest tylko jeden przycisk (na przykład button1).Programowanie zdarzenia sterowania wyzwalacza programowo

Pytanie brzmi: czy można wywołać zdarzenie ButtonClicked przez kod bez kliknięcia?

+2

od tego pytania wciąż żywe (nawet mam jakąś reputację :)), chciałbym umieścić tutaj małe ostrzeżenie: jeśli uważasz, że musisz zrobić coś takiego w swoim kodzie niż prawie na na pewno robisz coś złego. Ja też. Prawdopodobnie masz kiepski wygląd i lepiej poświęcić trochę czasu, zastanawiając się, co robisz i dlaczego. – steavy

+0

Właściwie uważam, że jest to istotne pytanie, chciałem stworzyć menu podręczne, które ogólnie zawiera wszystkie elementy z paska narzędzi, a także to, co już miało menu kontekstowe, metoda PerformClick wspomniana przez itsme86 pomogła :-) – s1cart3r

Odpowiedz

29

Kontrolki przycisków mają metodę PerformClick(), którą możesz wywołać.

button1.PerformClick(); 
+0

to jest dobre do klikania , ale co, jeśli potrzebuję kolejnego wydarzenia? – steavy

+2

Ogólnie rzecz biorąc, będziesz musiał po prostu wywołać swoje programy obsługi zdarzeń ręcznie. np .: button1_Shown (button1, EventArgs.Empty); – itsme86

9

można po prostu wywołać funkcję obsługi zdarzenia bezpośrednio i określić null dla nadawcy i EventArgs.Empty dla argumentów.

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); 

Albo raczej, chcesz przenieść logikę z imprezy ButtonClicked do własnej funkcji, a następnie obsługi zdarzeń, a drugi kod trzeba będzie z kolei wywołać nową funkcję.

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(); 

Ta druga metoda ma tę zaletę, że umożliwia oddzielenie logiki biznesowej i interfejsu użytkownika. Naprawdę nie powinieneś mieć żadnej logiki biznesowej w swoich kontrolerach zdarzeń sterujących.

1
button1.PerformClick(); 

Ale jeśli musisz zrobić coś takiego, to może lepiej przenieść kod pod zdarzenie na nową metodę?

4

Tak, po prostu wywołaj metodę w taki sposób, w jaki nawiążesz jakąkolwiek inną. Na przykład:

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

Nie muszę wywoływać metody obsługi. Potrzebuję wywołać zdarzenie. Handler jest wywoływany po zdarzeniu wyzwalającym. – steavy

17

.NET Framework wykorzystuje wzór gdzie dla każdego zdarzenia X istnieje metoda protected void OnX(EventArgs e) {} że budzi zdarzenie X. Zobacz tę Msdn article. Aby wywołać zdarzenie spoza klasy deklarującej, musisz wyprowadzić klasę i dodać publiczną metodę pakowania. W przypadku Button to będzie wyglądać następująco:

class MyButton : System.Windows.Forms.Button 
{ 

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

} 
0

użyć dla pętli wywołać zdarzenie button_click

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


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

zakładamy co najmniej jeden raz trzeba kliknąć przycisk

+2

Daj spokój! jak na Ziemi jest to związane z pytaniem? – chouaib

1

Dlaczego nie umieszczaj swojego kodu zdarzenia w metodzie. Następnie wywołaj metodę Event. W ten sposób, jeśli potrzebujesz wykonać ten sam kod, który rośnie, możesz po prostu wywołać "Metodę".

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

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

void AnotherMethod() 
{ 
    Event_Method(); 
} 

Sens? Teraz zdarzenie "Kliknij" I gdziekolwiek w kodzie możesz wywołać ten sam kod, co zdarzenie "Kliknij".

Nie wyzwalaj zdarzenia, wywołaj metodę, którą wywołuje zdarzenie. ;)

Powiązane problemy