Получение выбранного значения выпадающего списка

public class ComboboxItem { 
            public string Text { get; set; } 
            public string Value { get; set; }
            public override string ToString() { return Text; } 
        }

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int selectedIndex = comboBox1.SelectedIndex;
            int selecteVal = (int)comboBox1.SelectedValue; 
            ComboboxItem selectedCar = (ComboboxItem)comboBox1.SelectedItem;
            MessageBox.Show(String.Format("Index: [{0}] CarName={1}; Value={2}", selectedIndex, selectedCar.Text, selecteVal));
        }

Я добавляю их как:

ComboboxItem item = new ComboboxItem();
                    item.Text = cd.Name;
                    item.Value = cd.ID;
                    this.comboBox1.Items.Add(item);

Я продолжаю получать NullReferenceExeption и не знаю, почему. текст вроде нормально отображается.


person maxy    schedule 01.08.2011    source источник


Ответы (7)


Попробуй это:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    ComboBox cmb = (ComboBox)sender;
    int selectedIndex = cmb.SelectedIndex;
    int selectedValue = (int)cmb.SelectedValue;

    ComboboxItem selectedCar = (ComboboxItem)cmb.SelectedItem;
    MessageBox.Show(String.Format("Index: [{0}] CarName={1}; Value={2}", selectedIndex, selectedCar.Text, selecteVal));        
}
person James Hill    schedule 01.08.2011
comment
Я думаю, что класс ComboBoxItem доступен только в проектах WPF. - person T30; 24.11.2014
comment
ОП заявил об этом в своем посте. Удивлен, что в пространстве имен System.Windows.Forms его нет... или я что-то пропустил? - person AS7K; 01.04.2019

Вы получаете NullReferenceExeption, потому что используете cmb.SelectedValue, который равен нулю. comboBox не знает, каково значение вашего пользовательского класса ComboboxItem, поэтому либо выполните:

ComboboxItem selectedCar = (ComboboxItem)comboBox2.SelectedItem;
int selecteVal = Convert.ToInt32(selectedCar.Value);

Или лучше использовать привязку данных, например:

ComboboxItem item1 = new ComboboxItem();
item1.Text = "test";
item1.Value = "123";

ComboboxItem item2 = new ComboboxItem();
item2.Text = "test2";
item2.Value = "456";

List<ComboboxItem> items = new List<ComboboxItem> { item1, item2 };

this.comboBox1.DisplayMember = "Text";
this.comboBox1.ValueMember = "Value";
this.comboBox1.DataSource = items;
person Jalal Said    schedule 01.08.2011
comment
Разве нельзя использовать comboBox.SelectedValue для пользовательского элемента без использования источника данных? Например. если вы используете источник данных, вы не можете удалить или добавить элемент в элементы списка. - person user3532232; 09.05.2016

У меня была аналогичная ошибка, мой класс

public class ServerInfo
{
    public string Text { get; set; }
    public string Value { get; set; }
    public string PortNo { get; set; }

    public override string ToString()
    {
        return Text;
    }
}

Но что я сделал, я привел свой класс к свойству SelectedItem ComboBox. Итак, у меня будут все свойства класса выбранного элемента.

// Code above
ServerInfo emailServer = (ServerInfo)cbServerName.SelectedItem;

mailClient.ServerName = emailServer.Value;
mailClient.ServerPort = emailServer.PortNo;

Я надеюсь, что это поможет кому-то! Ваше здоровье!

person Jason Cidras    schedule 13.02.2014

Попробуй это:

private void cmbLineColor_SelectedIndexChanged(object sender, EventArgs e)
    {
        DataRowView drv = (DataRowView)cmbLineColor.SelectedItem;
        int selectedValue = (int)drv.Row.ItemArray[1];
    }
person Vikas4u    schedule 19.05.2015

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

int selectedValue;
bool parseOK = Int32.TryParse(cmb.SelectedValue.ToString(), out selectedValue);
person Tariq Nawaz Khan    schedule 28.07.2016

Попробуй это:

int selectedIndex = comboBox1.SelectedIndex;
comboBox1.SelectedItem.ToString();
int selectedValue = (int)comboBox1.Items[selectedIndex];
person Hakan Murat Aksüt    schedule 10.11.2018
comment
У OP был вопрос C#. Ваш ответ выглядит как С++. - person Adrian W; 10.11.2018

Вы должны передать выбранный элемент в свой пользовательский класс (ComboboxItem). Попробуйте следующее:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox cmb = (ComboBox)sender;
            int selectedIndex = cmb.SelectedIndex;
            string selectedText = this.comboBox1.Text;
            string selectedValue = ((ComboboxItem)cmb.SelectedItem).Value.ToString();

ComboboxItem selectedCar = (ComboboxItem)cmb.SelectedItem;
MessageBox.Show(String.Format("Index: [{0}] CarName={1}; Value={2}", selectedIndex, selectedCar.Text, selecteVal));        

}

person Prabodha    schedule 05.04.2020