我有ComboBox
个项目。我在SelectedIndexChanged
事件中添加了一个事件处理程序。假设,列表有两个项目,A和B.如果当前选择的项目是A,并且用户将其更改为B,则会触发该事件,这是正常的。但是,如果用户点击ComboBox
并再次点击A(意味着该项尚未实际更改),则仍会触发该事件。我希望事件只有在项目确实发生变化时才会被解雇,或者是允许我完成此任务的事情。
答案 0 :(得分:4)
如果您没有按计划选择更改ComboBox
选择,请尝试使用SelectionChangeComitted
。
答案 1 :(得分:3)
最好在从ComboBox派生的类中填充此逻辑(在我的示例中为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");
}
答案 2 :(得分:2)
我认为这就是你的意思:
int intIndex; //Global Variable
//In your ComboBox_SelectedIndex Changed event
if(myComboBox.SelectedIndex != intIndex)
{
//your code
intIndex = myComboBox.SelectedIndex;
}
答案 3 :(得分:2)
简单地将事件处理程序添加到TextChanged事件而不是SelectedIndexChanged已解决了我的问题。这适用于我的情况,因为我可以确定ComboBox中没有两个项目(这是一个下拉列表)将具有相同的文本。
答案 4 :(得分:1)
一种解决方案是将组合框数据绑定到模型类中的属性。然后,该模型应实现接口INotifyPropertyChanged(并正确触发它,因此仅在更改值时)。然后,您可以使用PropertyChanged事件来处理控件选择的更改,并且只有在发生实际更改时才会触发此事件。
答案 5 :(得分:1)
您可以使用ComboBox的SelectedIndex定义int变量,然后可以检查变量是否与索引具有相同的值。 如果是的话,不要做任何事,否则就做。
int lastIndex = myComboBox.SelectedIndex;
然后在SelectedIndexChangedEvent:
中if(lastIndex != myComboBox.SelectedIndex){
//do something
}
答案 6 :(得分:0)
,将它放在你的组合框中
private void InitializeComponent()
{
///combobox
///This line will triger if the combobox has changed
this.combobox.SelectedIndexChanged += System.EventHandler(this.comboboxChanged);
}
然后在你的main方法中创建像
这样的组合框方法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";
}
}