我有这段简单的代码用于填充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.
我无法弄清楚什么,有什么建议可以寻找吗?
答案 0 :(得分:0)
您有可能处理SelectedIndexChanged
或SelectedValueChanged
或任何其他事件。当您设置组合框的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之前,您应该设置DisplayMember
和DataSource
属性。
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.
}
}
如果您不想不必要地拨打活动,我想建议第二个选项。