2012-09-21 31 views
0

我得由我所有的單選按鈕共享一個事件處理程序:爲什麼我的共享事件處理程序認爲處理程序的主格「owner」始終是發件人?

private void radioButtonPackers_CheckedChanged(object sender, EventArgs e) 
{ 
    var rb = sender as RadioButton; 
    if (rb == radioButtonPackers) 
    { 
     team = NFCNorth.Packers; 
    } else if (rb == radioButtonBears) 
    { 
     team = NFCNorth.Bears; 
    } else if . . . 
} 

RB總是被看作是radioButtonPackers,我檢查了radioButtonBears,radioButtonVikings,或radioButtonLions單選按鈕後還是一樣。

我必須做這樣的事情:

if (radioButtonPackers.Checked) 
{ 
    team = NFCNorth.Packers; 
} 
else if (radioButtonBears.Checked) 
{ 
    team = NFCNorth.Bears; 
} 
. . . 

+0

如何一定是你該事件處理程序是真的* *在所有按鈕之間共享?你能展示一個簡短但完整的程序來證明問題嗎? –

+0

從Designer.cs文件中: this.radioButtonPackers.CheckedChanged + = new System.EventHandler(this.radioButtonPackers_CheckedChanged); this.radioButtonBears.CheckedChanged + = new System.EventHandler(this.radioButtonPackers_CheckedChanged); this.radioButtonLions.CheckedChanged + = new System.EventHandler(this.radioButtonPackers_CheckedChanged); this.radioButtonVikings.CheckedChanged + = new System.EventHandler(this.radioButtonPackers_CheckedChanged); –

回答

1

您需要注意rb.Checked,但根據我的經驗,無論如何,在獲得「檢查」之前,您將會收到「未檢查」的事件。下面是其工作的一個簡短但完整的例子:如果您在按鈕1,然後雙擊按鈕2

using System; 
using System.Windows.Forms; 

class Program 
{ 
    public static void Main() 
    { 
     var b1 = new RadioButton { Text = "Button 1" }; 
     var b2 = new RadioButton { Text = "Button 2" }; 

     EventHandler handler = (sender, args) => { 
      RadioButton button = (RadioButton) sender; 
      Console.WriteLine("{0} {1}", 
       button.Text, 
       button.Checked ? "Checked" : "Unchecked"); 
     }; 

     b1.CheckedChanged += handler; 
     b2.CheckedChanged += handler; 

     var form = new Form { 
      Controls = { 
       new FlowLayoutPanel { 
        FlowDirection = FlowDirection.TopDown, 
        Controls = { b1, b2 } 
       } 
      } 
     }; 
     Application.Run(form); 
    }  
} 

,你會看到:

Button 1 Checked  
Button 1 Unchecked  
Button 2 Checked 
2

實際上,它並不以這種方式工作。它必須像點擊一個sender接收任何單選按鈕。你的困惑可以涉及到一個事實,即radioButtonPackers_CheckedChanged你能接受兩次,在情況下,如果單選按鈕分組,所以當點擊一個當前的

  • 首次成爲選中後(所以提高事件)
  • 出現「新」的單選按鈕
+0

那麼,「只做東西」if(rb.Checked)'「的外賣呢? :) – AKX

+0

@AKX:它取決於OP是否需要做某些事情**僅**在「檢查」的情況下,可能有一些事情也必須發生,如果某個'radiobutton'變成未選中狀態。 – Tigran

+0

,但對於這種情況(並看看接受的答案),這似乎是這種情況:) – AKX

1

我的猜測是你的代碼工作正常,但你看到被解僱的事件的CheckedChanged爲之前選擇的單選按鈕,當它被檢查,未經檢查的變化,剛剛選定的單選按鈕獲取其檢查(前並且事件引發了它)。

相關問題