Получить текущий индекс ComboBox? - PullRequest
4 голосов
/ 08 сентября 2011

Скажем, у меня был ComboBox со следующими значениями:

Black
Red
Blue

И я выбрал Red в данный момент. Если пользователь затем нажимает клавишу Backspace и нажимает клавишу Enter, я фиксирую событие KeyDown ComboBox.

В этом случае я хочу удалить Красный из списка элементов в ComboBox.

Однако, поскольку к моменту вызова KeyDown текст ComboBox пуст, значение SelectedIndex равно -1.

В настоящее время у меня есть обходной путь, который выглядит следующим образом:

private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    currentMyComboBoxIndex = myComboBox.FindStringExact(myComboBox.Text);
}

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

Спасибо.

Ответы [ 3 ]

8 голосов
/ 08 сентября 2011

То, как вы делаете это хорошо. Вы должны сохранить выбранный индекс в памяти, потому что он возвращает -1 как SelectedIndex, когда текст удаляется. Вы также можете взять индекс таким же образом.

private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    currentMyComboBoxIndex = myComboBox.SelectedIndex;
}
2 голосов
/ 08 сентября 2011

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

ComboBox comboBox = new ComboBox();
// Initialize combo box
comboBox.Items.Add("Black");
comboBox.Items.Add("Red");
comboBox.Items.Add("Blue");
// Get selected one
string current = (string)comboBox.SelectedItem;

Кроме того, выбранный элемент можно легко удалить с помощью одной из следующих строк кода:

// By item
comboBox.Items.Remove(comboBox.SelectedItem);
// By Index
comboBox.Items.RemoveAt(comboBox.SelectedIndex);
0 голосов
/ 01 февраля 2018

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

Использование :

int cmbindex  = CmbIdxFindByValue("YourValue", cmbYourComboBox);

Функция :

private int CmbIdxFindByValue(string text, ComboBox cmbCd)
    {
        int c = 0; ;
        DataTable dtx = (DataTable)cmbCd.DataSource;
        if (dtx != null)
        {
            foreach (DataRow dx in dtx.Rows)
            {
                if (dx[cmbCd.ValueMember.ToString()].ToString() == text)
                    return c;
                c++;
            }
            return -1;
        }else
            return -1;
    }
...