繁体   English   中英

Winforms ComboBox仅在项目更改时触发事件

[英]Winforms ComboBox only fire event when item has changed

我有一个带有多个项目的ComboBox 我已将一个事件处理程序添加到SelectedIndexChanged事件中。 假设该列表包含两个项,即A和B。如果当前选择的项为A,并且用户将其更改为B,则将触发该事件,这没关系。 但是,如果用户单击ComboBox并再次单击A(表示该项实际上并未更改),则仍会触发该事件。 我希望仅在项目确实发生更改或可以让我完成此操作的情况下才触发该事件。

如果您不打算以图表方式更改ComboBox选择,请尝试使用SelectionChangeComitted

最好将此逻辑封装在派生自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");
    }

我认为这是您的意思:

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

只需将事件处理程序添加到TextChanged事件而不是SelectedIndexChanged即可解决了我的问题。 这对我而言有效,因为我可以确定ComboBox(这是一个下拉列表)中没有两个项目具有相同的文本。

一种解决方案是将组合框数据绑定到模型类中的属性。 然后,该模型应实现接口INotifyPropertyChanged(并正确触发它,因此仅在更改值时触发)。 然后,您可以使用PropertyChanged事件来处理控件选择中的更改,并且仅在发生实际更改时才会触发此事件。

您可以使用ComboBox的SelectedIndex定义一个int变量,然后可以检查该变量是否具有与索引相同的值。 如果是,则什么也不做,否则就做。

int lastIndex = myComboBox.SelectedIndex;

然后在SelectedIndexChangedEvent中:

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

在您的InitializeComponent()中 ,将其放入组合框

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

然后在您的main方法中创建combobox方法,例如

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";
        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM