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?
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?
Kontrolki przycisków mają metodę PerformClick(), którą możesz wywołać.
button1.PerformClick();
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.
button1.PerformClick();
Ale jeśli musisz zrobić coś takiego, to może lepiej przenieść kod pod zdarzenie na nową metodę?
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);
}
Nie muszę wywoływać metody obsługi. Potrzebuję wywołać zdarzenie. Handler jest wywoływany po zdarzeniu wyzwalającym. – steavy
.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);
}
}
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
Daj spokój! jak na Ziemi jest to związane z pytaniem? – chouaib
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. ;)
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
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