C# ComboBox数据源出现异常

C# ComboBox数据源出现异常,c#,winforms,visual-studio-2012,combobox,C#,Winforms,Visual Studio 2012,Combobox,我有一段用于填充组合框的简单代码: 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"; dropdown

我有一段用于填充组合框的简单代码:

 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个
组合框
,所有这些组合框都与上面的代码一起工作并被填充,只有当填充
DataSouce时,这个
组合框
我得到异常:

Object reference not set to an instance of an object.

我想不出什么,有什么建议需要寻找吗?

当您处理了
SelectedIndexChanged
SelectedValueChanged
或任何其他事件时,可能会出现这种情况。当您设置组合框的
DataSource
属性时,将调用该属性

发生这种情况是因为在分配
数据源时未设置
ValueMember
。假设您在组合框的
SelectedValueChanged
事件中编写了一行代码,如下所示

 String myVal = dropdownCourses.SelectedValue.ToString();
在这里,我试图将
SelectedValue
转换为字符串类型的值

此代码将在分配Combobox的
DataSource
之后和分配
ValueMember
属性之前立即执行。因此,这意味着组合框没有
ValueMember
字段

因此,
SelectedValue
属性中的值将是
null
,并且
null
不能有任何我们试图将其转换为字符串的属性或方法。因此,这将抛出错误
未设置对象实例的对象引用

解决方案:

在将
DataSource
分配给组合框之前,应设置
ValueMember
DisplayMember
属性

dropdownCourses.ValueMember = "ID"; //First
dropdownCourses.DisplayMember = "Course";  //Second
dropdownCourses.DataSource = dt.Tables[0]; //Third
第二种方法是,您可以创建一个布尔标志,以避免在填充组合框期间进行不必要的事件调用

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.
    }
}

若你们不想不必要地把这件事称为“事件”,我想建议第二种选择

当您分配表中的行大约为48行时,它可能为空。我确认了这一点。如果(dt.Tables[0].Rows.Count>0),它将进入循环,因此它有一些东西。.如果(dt.Tables.Count>0)添加一个条件@Sajeetharan如果它确认dt.Tables[0].Rows.Count>0,它不是自动确认dt.Tables.Count>0吗0@Steve,您是rite,我在代码中的某个地方错误地执行了dropdownCourse=null,这导致了此问题。