Ссылка на объект не установлена ​​для экземпляра объекта в ComboBox - PullRequest
2 голосов
/ 10 августа 2011

У меня есть comboBox в окнах форм, которые я привязал к источнику данных, который правильно возвращает идентификатор, связанный с конкретным именем в выпадающем списке, при загрузке формы.

private void PurchaseMaster_Load(object sender, EventArgs e)
{
    DataTable dt = productMasterBAL.GetTable("Select * from productMaster");
    comboBox1.DataSource = dt;
    comboBox1.DisplayMember = "ProductName";
    combBox1.ValueMember = "ProductId";
}

Но всякий раз, когда я выбираю любое значение в ComboboxЯ получаю:

Исключение NullReferenceException было обработано.Ссылка на объект не установлена ​​для экземпляра объекта

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{

           DataRowView row = comboBox1.SelectedValue as DataRowView;
           MessageBox.Show(String.Format("{0}", row["ProductId"])); //This line is causing exception
}

Может кто-нибудь сказать, как я могу решить эту проблему?

Ответы [ 6 ]

3 голосов
/ 10 августа 2011

Я думаю, что вы должны проверять combobox1.SelectedItem, а не SelectedValue.

 DataRowView row = combobox1.SelectedItem as DataRowView; 

SelectedItem - строка с привязкой к данным, которая создала эту запись в поле со списком. SelectedValue будет ProductID этой строки.

Или, вы можете попробовать

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    string productId = combobox1.SelectedValue as string;
    if (productId != null) 
    {
        MessageBox.Show(productId);
    }
}
1 голос
/ 10 августа 2011

Вы должны проверять значения, подобные этому

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
   ComboBox cmb = (ComboBox)sender;
   MessageBox.Show(cmb.SelectedValue.ToString());// cmb.SelectedText
}

Это должно дать вам выбранный идентификатор продукта в поле со списком

Элементы в Combobox хранятся как ObjectCollection, а не точно как DataRow или DataRowView, как вы ожидаете.

1 голос
/ 10 августа 2011

Вы отладили? Проверить, что строка не нулевая? из MSDN:

Оператор as похож на операцию приведения. Тем не менее, если преобразование невозможно, так как возвращает нулевое значение вместо создания исключения.

Вы проверили, является ли это выражение допустимым как тип?

0 голосов
/ 26 февраля 2013

Проверьте мое общее решение в этой теме:

c # цикл через выпадающий список, где источником данных является дата, с текстом

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

ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);

Надеюсь, это поможет!

0 голосов
/ 10 августа 2011

Вы пытаетесь привести PName.SelectedValue типа «String» к объекту DataRowView \ с использованием «safe-cast». as возвращает ноль, если объект не может быть приведен к нужному классу. Итак, настоящая ошибка в

 DataRowView row = PName.SelectedValue as DataRowView;

Попробуйте прямое приведение с DataRowView row = (DataRowView)PName.SelectedValue, вы обязательно получите ошибку.

Вам нужно снова запросить источник данных, чтобы получить объект данных.

0 голосов
/ 10 августа 2011

Может быть row["ProductId"], я думаю, не строковое поле, поэтому оно возвращает исключение при форматировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...