2012-11-27 57 views
0

我有一個ComboBox有幾個項目。我已經爲SelectedIndexChanged事件添加了一個事件處理程序。假設列表有兩個項目A和B.如果當前選擇的項目是A並且用戶將其更改爲B,則該事件被觸發並且沒有問題。但是,如果用戶點擊ComboBox並再次點擊A(意味着該項目未實際更改),則該事件仍會被觸發。如果該項目已經發生了變化,我希望這個事件只能被解僱,或者讓我能夠完成這件事。Winforms組合框只在項目發生變化時觸發事件

+0

你能解釋你的代碼嗎? –

+0

cmbReportTypes.SelectedIndexChanged + =(a,b)=> SelectedReport =((ReportItem)cmbReportTypes.SelectedItem).CreateReport(); 這是事件。本身很簡單。我只是希望它在索引發生變化時才被解僱。示例:如果索引從0更改爲1,則將被觸發。如果索引從0更改爲0,那麼我不希望事件被觸發 –

回答

2

只需將事件處理程序添加到TextChanged事件而不是SelectedIndexChanged中即可解決我的問題。這適用於我的情況,因爲我可以確定ComboBox中沒有兩個項目(它是下拉列表)將具有相同的文本。

+0

對我無效。在我設置DataSource屬性時,TextChanged奇怪地僅在表單加載時觸發。 – nightcoder

2

我覺得這是你的意思:

int intIndex; //Global Variable 
//In your ComboBox_SelectedIndex Changed event 
if(myComboBox.SelectedIndex != intIndex) 
{ 
    //your code 
    intIndex = myComboBox.SelectedIndex; 
} 
1

一個解決辦法是進行數據綁定組合框的屬性在模型類。然後模型應該實現接口INotifyPropertyChanged(並正確觸發它,所以只有當值被改變時)。然後,您可以使用PropertyChanged事件來處理控件選擇的更改,並且只有在發生實際更改時纔會觸發此事件。

0

您可以使用ComboBox的SelectedIndex定義一個int變量,然後您可以檢查變量是否與索引具有相同的值。 如果是的話,不要做任何事情,否則做的東西。

int lastIndex = myComboBox.SelectedIndex; 

然後在SelectedIndexChangedEvent:

if(lastIndex != myComboBox.SelectedIndex){ 
    //do something 
} 
4

如果你不打算改變ComboBox選擇圖解嘗試使用SelectionChangeComitted

3
更好

到incapsulate類這個邏輯從組合框(ComboBoxEx在我的例子)衍生

private class ComboBoxEx : System.Windows.Forms.ComboBox 
    { 
     Int32 _lastIndex = -1; 
     protected override void OnSelectedIndexChanged(System.EventArgs e) 
     { 
      if (_lastIndex == -1) 
      { 
       _lastIndex = this.SelectedIndex; 
       base.OnSelectedIndexChanged(e); 
      } 
      else 
       if (_lastIndex != this.SelectedIndex) 
       { 
        base.OnSelectedIndexChanged(e); 
        _lastIndex = this.SelectedIndex; 
       } 
     } 
    } 

而且使用這樣的:

public Form1() 
    { 
     var combobox = new ComboBoxEx() { DropDownStyle = ComboBoxStyle.DropDownList }; 
     combobox.Items.Add("Item 1"); 
     combobox.Items.Add("Item 2"); 
     combobox.Items.Add("Item 3"); 
     this.Controls.Add(combobox); 
     combobox.SelectedIndexChanged += OnIndexChanged; 

     InitializeComponent(); 
    } 

    private void OnIndexChanged(object sender, EventArgs e) 
    { 
     MessageBox.Show("Index changed"); 
    } 
0
的InitializeComponent()

,把這個在您的組合框中

private void InitializeComponent() 
{ 
    ///combobox 
    ///This line will triger if the combobox has changed 
    this.combobox.SelectedIndexChanged += System.EventHandler(this.comboboxChanged); 
} 

然後在你的主要方法中創建組合框方法,如

private string previousValue; 

Private void comboboxChanged(object sender, EventArgs e) 
{ 
    if (combobox.Text == "A" && previousValue == "A") 
     { 
      //Do nothing 
      previousValue = "A"; 
     } 
    else if (combobox.Text == "B" && previousValue == "B") 
     { 
      //Do Nothing 
      previousValue = "B"; 
     } 
    else if (combobox.Text == "A") 
     { 
      //Do Something 
      previousValue = "A"; 
     } 
    else if (combobox.Text == "B") 
     { 
      //Do Something 
      previousValue = "B"; 
     } 
} 
+0

爲了未來的讀者,你能解釋爲什麼這個工作。 – litelite

+0

@litelite我編輯了我的答案。事件仍在發射,但是OP想要完成的是如果值變化A變爲B,那麼做什麼。如果值A變爲A,那麼什麼都不做。 –

相關問題