Событие ComboBox SelectedIndexChanged: как получить ранее выбранный индекс?

У меня есть пользовательский элемент управления, который имеет обработчик событий 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;
    }
}

Ответы

Ответ 1

Нет ничего встроенного, вам нужно будет слушать это событие и отслеживать его в переменной экземпляра.

Используйте -1 как неинициализированный "последний индекс", поэтому сначала сначала установите его, но не используйте. Последующие проходы вы используете его и устанавливаете.

Вы всегда можете сделать это, используя собственный класс ComboBox и переопределить OnSelectedIndexChanged и выставить свойство PreviousSelectedIndex. Таким образом, он не будет тесно связан с формой. В качестве альтернативы, поскольку вы можете сделать это с помощью событий, его также можно использовать в качестве поставщик расширений.

Ответ 2

Я думаю, вам нужно будет сохранить текущий (который станет последним позже) в переменной, чтобы он использовался как кеш или что-то вроде этого.

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. = (

Ответ 3

как насчет события comboBox_SelectionChangeCommitted? это вызывается после того, как выбор сделан, меню рухнуло, но элемент не был полностью изменен. Так что просто прочитайте comboBox.SelectedText или comboBox.SelectedValue и даже comboBox.SelectedIndex

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

Ответ 4

Этот, чтобы получить текущий выбранный индекс, мне просто нужно, и я не смог найти нигде, поэтому надеюсь, что он поможет

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

Ответ 5

У меня была аналогичная проблема, в которой я установил все свои поля со списком "автозаполнение", используя

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

Я зациклился и установил все свои lostFocus Events:

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