Событие ComboBox SelectedIndexChanged: как получить ранее выбранный индекс? - PullRequest
15 голосов
/ 13 июля 2010

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

Ответы [ 5 ]

23 голосов
/ 13 июля 2010

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

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

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

3 голосов
/ 13 июля 2010

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

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

0 голосов
/ 15 августа 2017

У меня была похожая проблема, в которой я установил все свои поля со списком на «автозаполнение», используя

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;
}
0 голосов
/ 06 мая 2016

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

 private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e)
        {
            int i = lsbx_layers.SelectedIndices[0];//selected index
            MessageBox.Show("Selected item at index : " + i);
        }
0 голосов
/ 02 марта 2016

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

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