我有一個ComboBox
有幾個項目。我已經爲SelectedIndexChanged
事件添加了一個事件處理程序。假設列表有兩個項目A和B.如果當前選擇的項目是A並且用戶將其更改爲B,則該事件被觸發並且沒有問題。但是,如果用戶點擊ComboBox
並再次點擊A(意味着該項目未實際更改),則該事件仍會被觸發。如果該項目已經發生了變化,我希望這個事件只能被解僱,或者讓我能夠完成這件事。Winforms組合框只在項目發生變化時觸發事件
回答
只需將事件處理程序添加到TextChanged事件而不是SelectedIndexChanged中即可解決我的問題。這適用於我的情況,因爲我可以確定ComboBox中沒有兩個項目(它是下拉列表)將具有相同的文本。
對我無效。在我設置DataSource屬性時,TextChanged奇怪地僅在表單加載時觸發。 – nightcoder
我覺得這是你的意思:
int intIndex; //Global Variable
//In your ComboBox_SelectedIndex Changed event
if(myComboBox.SelectedIndex != intIndex)
{
//your code
intIndex = myComboBox.SelectedIndex;
}
一個解決辦法是進行數據綁定組合框的屬性在模型類。然後模型應該實現接口INotifyPropertyChanged(並正確觸發它,所以只有當值被改變時)。然後,您可以使用PropertyChanged事件來處理控件選擇的更改,並且只有在發生實際更改時纔會觸發此事件。
您可以使用ComboBox的SelectedIndex定義一個int變量,然後您可以檢查變量是否與索引具有相同的值。 如果是的話,不要做任何事情,否則做的東西。
int lastIndex = myComboBox.SelectedIndex;
然後在SelectedIndexChangedEvent:
if(lastIndex != myComboBox.SelectedIndex){
//do something
}
如果你不打算改變ComboBox
選擇圖解嘗試使用SelectionChangeComitted
。
到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");
}
,把這個在您的組合框中
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";
}
}
爲了未來的讀者,你能解釋爲什麼這個工作。 – litelite
@litelite我編輯了我的答案。事件仍在發射,但是OP想要完成的是如果值變化A變爲B,那麼做什麼。如果值A變爲A,那麼什麼都不做。 –
- 1. 當組合框中的項目數發生變化時觸發的事件
- 2. 當WPF組合框發生變化時觸發命令
- 3. 當Ember.Select選項發生變化時觸發onchange事件
- 4. 任何變量發生變化時觸發一個事件
- 5. 如何在模型屬性發生變化時觸發事件
- 6. AS3 ENTER_FRAME事件仍然在幀發生變化時觸發
- 7. 爲同一項目觸發組合框選擇事件
- 8. 在jQuery組合框上選擇一次下拉項目時觸發事件
- 9. 打開相同MDI子項時,組合框值發生變化
- 10. 組合框事件觸發器即使在用戶未選擇項目時也會發生
- 11. 變量值變化時觸發事件
- 12. Obout組合框的事件觸發只在頁面加載
- 13. 每次數組發生變化時發生Typscript火災事件
- 14. 當css值發生變化時觸發事件
- 15. 當頁面主題發生變化時觸發什麼事件
- 16. 當ListView的ItemsSource發生變化時觸發事件
- 17. <input type =「number」/>什麼事件發生變化時觸發?
- 18. 當MKMAPVIEW範圍發生變化時會觸發什麼事件
- 19. 表單發生變化時觸發的事件
- 20. 當UITabBarController的'selectedViewController'發生變化時觸發一個事件?
- 21. 當ListBox.Item的大小發生變化時觸發事件
- 22. 當div中的內部html發生變化時觸發事件
- 23. 當前日期發生變化時觸發Backbone.js事件
- 24. 當某個類發生變化時觸發事件
- 25. 當底層發生變化時,OpenLayers 2觸發事件
- 26. Winforms C#中的兩個同時發生的Textchanged事件觸發#
- 27. 變化事件觸發
- 28. 當asp文本框的文本發生變化時觸發事件
- 29. 如果事情發生變化,只能構建項目
- 30. 發生任何事件時發生任何文本框,組合框等內部形式的變化
你能解釋你的代碼嗎? –
cmbReportTypes.SelectedIndexChanged + =(a,b)=> SelectedReport =((ReportItem)cmbReportTypes.SelectedItem).CreateReport(); 這是事件。本身很簡單。我只是希望它在索引發生變化時才被解僱。示例:如果索引從0更改爲1,則將被觸發。如果索引從0更改爲0,那麼我不希望事件被觸發 –