2008-10-25 25 views
2

我的Windows窗體上有一個單選按鈕。我怎樣才能確定是否發生了CheckChanged事件由於用戶點擊或選擇單選按鈕VS與如何確定radioButton.Checked是以編程方式設置還是通過鼠標點擊?

this.radioButtonAdd.Checked = true; 

編程設定的事件,我想一些代碼,這取決於如果用戶點擊該按鈕,以採取不同的行動或者我自己提出這個事件。

或者更好的問題是,當我的代碼中狀態發生變化時,如何在用戶單擊時處理事件。

回答

2

我想我找到了一個不錯的答案。

所有Windows窗體控件都有一個名爲「Tag」的屬性。它的值可以是任何對象。

所以,如果我想則會忽略任何程序上的變化,我可以做到以下幾點:

radioButton.Tag = "ignore" 
radioButton.Checked = true 

然後在事件處理程序:

private void radioButton_CheckedChanged(object sender, EventArgs e) 
{ 
    if (radioButton.Checked) 
    { 
     // Tag will be null in cases where the user clicks 
     if (this.radioButtonAdd.Tag == null) 
     { 
      // do something 
     } 
     else 
     { 
      // swallow action 
      // reset Tag 
      this.radioButtonAdd.Tag = null; 
     } 
    } 
} 
2

如果有一個內置的方法,那麼我不知道它。

處理該問題的一種方法是在代碼進行更改時通過設置全局標誌來告訴事件處理程序。例如,進行更改的代碼可能類似於以下內容:

savedFlag = modifyingProgrammatically; 
modifyingProgrammatically = true; 
this.radioButtonAdd.Checked = true; 
modifingProgrammatically = savedFlag; 

在你的事件處理程序:

if(modifyingProgramatically) { 
    // The event was raised by an assignment within the code. 
} else { 
    // The event was raised by a user action. 
} 
1

你也可以做類似更改標誌字段值在單選按鈕的MouseDown上,然後在MouseClick上還原標誌值。由於CheckedChanged事件在兩者之間觸發,它可以在MouseClick事件恢復之前使用該標誌,並且不必擔心重置其狀態。

,你還可以有線程的問題,如果你使用一個字段作爲標誌(不知道很多關於你的工作的應用程序),但這樣的事情應該努力解決:

private bool _mouseEvent; 
    private void radioButton1_CheckedChanged(object sender, EventArgs e) 
    { 
     if (_mouseEvent) 
      MessageBox.Show("Changed by mouse click."); 
     else 
      MessageBox.Show("Changed from code."); 
    } 

    private void radioButton1_MouseClick(object sender, MouseEventArgs e) 
    { 
     _mouseEvent = false; 
    } 

    private void radioButton1_MouseDown(object sender, MouseEventArgs e) 
    { 
     _mouseEvent = true; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // This simulates a change from code vs. a change from 
     // a mouse click. 
     if (radioButton1.Checked) 
      radioButton2.Checked = true; 
     else 
      radioButton1.Checked = true; 
    } 

或者,您可以分開您的「鼠標點擊」應用程序邏輯,以便它由不同的事件(如MouseClick)觸發。

希望這會有所幫助。

相關問題