ComboBox数据源给出异常

时间:2015-03-28 08:28:24

标签: c# winforms visual-studio-2012 combobox

我有这段简单的代码用于填充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";
     dropdownCourses.ValueMember = "ID";
 }

我在表单上有4 ComboBoxes所有使用上面的代码并填充,仅填充此ComboBox时填充DataSouce我得到例外:

Object reference not set to an instance of an object.

我无法弄清楚什么,有什么建议可以寻找吗?

1 个答案:

答案 0 :(得分:0)

您有可能处理SelectedIndexChangedSelectedValueChanged或任何其他事件。当您设置组合框的DataSource属性时,将调用此方法。

这是因为在分配ValueMember时未设置DataSource。假设您在组合框的SelectedValueChanged事件中编写了一行代码。

 String myVal = dropdownCourses.SelectedValue.ToString();

在这里,我尝试将SelectedValue转换为字符串类型值。

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

因此,SelectedValue属性中的值将为null,而null不能包含我们尝试将其转换为字符串的任何属性或方法。因此,这将抛出错误object reference of instance of an object is not set

<强>解决方案:

在将ValueMember分配给ComboBox之前,您应该设置DisplayMemberDataSource属性。

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

如果您不想不必要地拨打活动,我想建议第二个选项。