0

我有ComboBox几个项目。我已经为事件添加了一个事件处理程序SelectedIndexChanged。假设列表有两个项目,A 和 B。如果当前选择的项目是 A,而用户将其更改为 B,则触发事件,这没关系。但是,如果用户单击ComboBox并再次单击 A(意味着该项目实际上并未更改),则仍会触发该事件。我希望仅在项目确实发生变化或允许我完成此操作的情况下才触发该事件。

4

7 回答 7

5

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

于 2012-11-27T10:35:55.170 回答
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");
    }
于 2012-11-27T10:44:40.817 回答
2

我想这就是你的意思:

int intIndex; //Global Variable
//In your ComboBox_SelectedIndex Changed event
if(myComboBox.SelectedIndex != intIndex) 
{
   //your code
   intIndex = myComboBox.SelectedIndex;
}
于 2012-11-27T10:32:55.403 回答
2

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

于 2012-11-27T10:36:33.273 回答
1

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

于 2012-11-27T10:33:28.180 回答
1

您可以使用 ComboBox 的 SelectedIndex 定义一个 int 变量,然后您可以检查该变量是否与索引具有相同的值。如果是,不要做任何事情,否则做这些事情。

int lastIndex = myComboBox.SelectedIndex;

然后在 SelectedIndexChangedEvent 中:

if(lastIndex != myComboBox.SelectedIndex){
     //do something
}
于 2012-11-27T10:35:34.637 回答
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";
        }
}
于 2016-08-15T17:11:40.907 回答