2013-07-19 45 views
0

我對C#非常陌生,而且我的Windows窗體應用程序中的事件處理程序遇到問題。我在運行時創建了多個單選按鈕(存儲在buttonz列表中),並且都有相同的事件處理程序分配給它們。C#如何防止分配給多個控件的事件處理程序被調用兩次?

foreach循環:

buttonz.Add(new RadioButton()); 
buttonz[buttonz.Count - 1].CheckedChanged += new EventHandler(radio_checked); 

下面是我的事件處理程序:

private void radio_checked(object sender, EventArgs e) 
{ 
    RadioButton btn = (RadioButton)sender; 
    Console.WriteLine("{0} Radio checked!", btn.Text); 
} 

輸出是:

Button1 Radio checked! (1st button is checked) 
Button1 Radio checked! (2nd button is checked) 
Button2 Radio checked! 
Button2 Radio checked! (3rd button is checked) 
Button3 Radio checked! 

因此,事件處理程序被調用時,該按鈕也未被檢查。我怎樣才能防止這一點?我已經閱讀了幾個問題,但他們對我的水平來說很複雜,因此我無法提取我需要的信息。解釋性答案非常值得歡迎。謝謝。

+0

'WPF'或'Winforms'? –

+0

我正在使用Winforms應用程序。忘了補充問題。 – Varaquilex

+0

您對每個按鈕使用相同的事件處理程序 - 當然,當單擊任何按鈕時,將執行相同的事件處理程序。使用發件人參數區分按鈕或使用不同的事件處理程序方法。 – VikciaR

回答

0

您在這裏面臨的問題是,該事件被稱爲 a)當控件被選中時,b)當控件未被選中時。 爲此的提示是該事件被稱爲CheckedChanged。

在事件處理程序中,您需要過濾調用。鑄造發件人複選框並選中「檢查」屬性:

if(btn.Checked) 
{ 
    Console.WriteLine("{0} Radio checked!", btn.Text); 
} 
1

您可以檢查按鈕的處理程序檢查將在您檢查並取消選中時觸發。

改變你的功能,看起來像這樣只打在選中。

private void radio_checked(object sender, EventArgs e) 
{ 
    RadioButton btn = (RadioButton)sender; 
    if(btn.Checked) 
     Console.WriteLine("{0} Radio checked!", btn.Text); 
} 
+0

原來沒有什麼可以解釋的:)對於最簡單的答案+1,儘管我會接受第一個答案。謝謝你。 – Varaquilex

0

您訂閱的事件是CheckedChanged因此它自然:

private void radio_checked(object sender, EventArgs e) 
{ 
    //Check if this is a radio button. It might be a checkbox! 
    if(sender is RadioButton) 
    { 
     RadioButton btn = (RadioButton)sender; 
     if(btn.Checked) 
      Console.WriteLine("{0} Radio checked!", btn.Text); 
    } 
} 
0

試試這個:

private void radio_checked(object sender, EventArgs e) 
{ 
    RadioButton btn = (RadioButton)sender; 
    if (btn.Checked) 
     Console.WriteLine("{0} Radio checked!", btn.Text); 
} 
0

如果你只是單純的想託運單選按鈕寫行添加此,如果:

private void radio_checked(object sender, EventArgs e) 
{ 
    RadioButton btn = (RadioButton)sender; 

    if (btn.Checked) 
    { 
     Console.WriteLine("{0} Radio checked!", btn.Text); 
    } 
} 
0

這裏的問題是,CheckedChanged事件處理程序被炒魷魚當一個單選按鈕被選中並且一個單選按鈕沒有被選中時,這就是爲什麼它會觸發兩次。

private void radio_checked(object sender, EventArgs e) 
{ 
    if((sender as RadioButton).Checked) 
    { 
     RadioButton btn = (RadioButton)sender; 
     Console.WriteLine("{0} Radio checked!", btn.Text); 
    } 
} 

像這樣這個方法的functionallity只在按鈕被檢查時運行,而不是在它被取消選中時運行。

0

你訂閱被稱爲「的CheckedChanged」事件,所以這意味着被改變檢查單選按鈕的狀態時,此事件將引發 - 這意味着當它被選中或取消選中

將惜售
相關問題