ComboBox SelectedIndexChanged事件:如何获取先前选择的索引?

时间:2010-07-13 13:58:12

标签: c# winforms .net-3.5

我有一个用户控件,它有一个ComboBox和一个SelectedIndexChanged事件处理程序。在事件处理程序中,我需要能够分辨出之前选择的索引是什么...有人能指出我正确的方向吗?

private void cboTargetMode_SelectedIndexChanged(object sender, EventArgs e)
{
    // need to get the previously selected index and do some handling here...
    // ... some handler code here ...


    switch (cboTargetMode.SelectedIndex)
    {
        case 1:  // ..... some code here...
            break;
        case 2:  // ..... some code here...
            break;
        case 3:  // ..... some code here...
            break;
        default: // ..... some code here...
            break;
    }
}

6 个答案:

答案 0 :(得分:23)

内置任何内容,您将需要侦听此事件并在实例变量中跟踪。

使用-1作为未初始化的“最后一个索引”,因此在第一次传递时设置它但不使用它。随后的传球你使用它并设置它。

您始终可以使用自己的派生ComboBox类来覆盖OnSelectedIndexChanged并公开PreviousSelectedIndex属性。这样,它就不会与表单紧密耦合。或者,正如您可以使用事件一样,它也可以作为extender provider实现。

答案 1 :(得分:3)

我猜你必须将当前的(将在之后的版本中)存储到一个变量中,以便它像缓存一样使用。

private void cboTargetMode_SelectedIndexChanged(object sender, EventArgs e) {
    // need to get the previously selected index and do some handling here...
    // ... some handler code here ...

    // Assuming that the variable PreviousSelectedIndex is declared in the class with value -1.
    if (PreviousSelectedIndex < 0)
        PreviousSelectedIndex = cbo.TargetMode.SelectedIndex;
    else
        // Do some handling here...

    switch (cboTargetMode.SelectedIndex) {
        case 1:  // ..... some code here...
            break;
        case 2:  // ..... some code here...
            break;
        case 3:  // ..... some code here...
            break;
        default: // ..... some code here...
            break;
    }
}

这是你已经想过的吗?

否则,也许正在处理Control.Validating事件?我只是不能说这个事件是在SelectedIndexChanged事件之前还是之后发生的。 =(

答案 2 :(得分:0)

comboBox_SelectionChangeCommitted事件怎么样?选择完成后调用此选项,菜单将折叠,但项目未完全更改。所以只需阅读comboBox.SelectedText或comboBox.SelectedValue甚至comboBox.SelectedIndex

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
    int prevIndex = comboBox1.SelectedIndex;
}

答案 3 :(得分:0)

这个获取当前选定的索引,我只需要它,我找不到任何地方,所以我希望它有所帮助

 private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e)
        {
            int i = lsbx_layers.SelectedIndices[0];//selected index
            MessageBox.Show("Selected item at index : " + i);
        }

答案 4 :(得分:0)

我遇到了类似的问题,我将所有的组合框设置为&#34; autocomplete&#34;使用

ComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
ComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;

我循环播放并设置所有lostFocus事件:

foreach(Control control in this.Controls)
{
    if(control is ComboBox)
   {
        ((ComboBox)control).LostFocus += ComboBox_LostFocus;
   }
}

并有一个字典对象来保存旧值

public Dictionary<string, int> comboBoxOldValues = new Dictionary<string, int>();

然后最后确保值存在或设置为旧索引,然后保存到字典

private void ComboBox_LostFocus(object sender, EventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;

    if (comboBox.DataSource is List<YourDataType>)
    {
        if (((List<YourDataType>)comboBox.DataSource).Count(x => x.YourValueMember == (YourValueMemberType)comboBox.SelectedValue) == 0)
        {
            if (comboBoxOldValues.Keys.Count(x => x == comboBox.Name) > 0)
            {
                comboBox.SelectedIndex = comboBoxOldValues[comboBox.Name];
            }
            else
                comboBox.SelectedIndex = -1;
        }
    }            

    if (comboBoxOldValues.Keys.Count(x => x == comboBox.Name) > 0)
    {
        comboBoxOldValues[comboBox.Name] = comboBox.SelectedIndex;
    }
    else
        comboBoxOldValues.Add(comboBox.Name,  comboBox.SelectedIndex);

    if (comboBox.SelectedIndex == -1)
        comboBox.Text = string.Empty;
}

答案 5 :(得分:0)

您可以获取旧值并将其存储在DropDown事件中。然后在SelectionChangeCommitted事件(如果有保证)中还原为该旧值。