2015-03-28 2 views
0

У меня есть этот простой кусок кода для заселять ComboBox:ComboBox Datasource давая исключение

DataSet dt = new DataSet(); 

dt = db.getCourses(depID, academicYearValue, semID); 
if (dt.Tables[0].Rows.Count > 0) 
{ 
    dropdownCourses.DataSource = dt.Tables[0]; 
    dropdownCourses.DisplayMember = "Course"; 
    dropdownCourses.ValueMember = "ID"; 
} 

У меня есть 4 ComboBoxes на форме все работы с указанным кодом и получить заполняется, только для этого ComboBox при наполнении DataSouce я получаю исключение:

Object reference not set to an instance of an object. 

И я ничего не могу понять, любые предложения о том, что искать?

+0

Возможно, это нулевое значение, когда вы назначаете – Sajeetharan

+0

. В таблице есть строки в нем примерно 48, я подтвердил это. Он войдет в цикл, если if (dt.Tables [0] .Rows.Count> 0), поэтому у него есть что-то .. – confusedMind

+0

добавить условие if (dt.Tables.count> 0) – Sajeetharan

ответ

0

Возможно, когда вы обработали SelectedIndexChanged или SelectedValueChanged или любое другое событие. Это будет вызываться, когда вы устанавливаете свойство DataSource вашего поля со списком.

Это происходит потому, что ValueMember не установлен, когда назначается DataSource. Предположим, вы написали строку кода в событии SelectedValueChanged вашего списка со списком.

String myVal = dropdownCourses.SelectedValue.ToString(); 

Здесь я пытаюсь преобразовать SelectedValue в значение типа строка.

Этот код будет выполнен сразу после присвоения DataSource Комбобокса и перед присвоением ValueMember. Таким образом, это означает, что поле со списком не имеет поля ValueMember.

Таким образом, значение в SelectedValue собственности будет null и null не может иметь свойство или метод, где мы пытаемся преобразовать его в строку. Таким образом, это вызовет ошибку object reference of instance of an object is not set.

Решение:

Вы должны установить ValueMember и DisplayMember свойства перед назначением DataSource в ComboBox.

dropdownCourses.ValueMember = "ID"; //First 
dropdownCourses.DisplayMember = "Course"; //Second 
dropdownCourses.DataSource = dt.Tables[0]; //Third 

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

bool bLoading = false; 

{ 
    dt = db.getCourses(depID, academicYearValue, semID); 
    if (dt.Tables[0].Rows.Count > 0) 
    { 
     bLoading = true; 
     try 
     { 
      dropdownCourses.DataSource = dt.Tables[0]; 
      dropdownCourses.DisplayMember = "Course"; 
      dropdownCourses.ValueMember = "ID"; 
     } 
     catch{} 
     finally{ 
      bLoading = false; //make sure that this variable must be false after populating combobox otherwise event will not work 
     } 
    } 
} 

private void dropdownCourses_SelectedValueChanged(....) 
{ 
    if (!bLoading) 
    { 
     Write your code here. 
    } 
} 

Я хотел бы предложить второй вариант, если вы не хотите, чтобы событие было ненужным.

Смежные вопросы