对象引用未设置为ComboBox中对象的实例

时间:2011-08-10 07:16:54

标签: c# .net winforms combobox

我在windows窗体中使用了comboBox,我绑定了数据源,只要表单加载,它就会正确地返回与组合框中特定名称相关联的Id。

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 个答案:

答案 0 :(得分:3)

我认为你应该检查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 :(得分:1)

你调试了吗?检查该行是否为空?来自msdn:

  

as运算符就像一个强制转换操作。但是,如果转换   是不可能的,因为返回null而不是引发异常。

您是否检查过此表达式是否有效?

答案 2 :(得分:1)

你应该检查这样的值

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

这应该会在组合框中为您提供所选的产品ID

Combobox中的项目存储为ObjectCollection,而不是您期望的DataRow或DataRowView。

答案 3 :(得分:0)

我认为row["ProductId"]可能不是字符串字段,所以它在格式化时返回异常。

答案 4 :(得分:0)

您正尝试使用'safe-cast'将PName.SelectedValue类型为“String”的对象转换为对象DataRowView \。如果无法将对象强制转换为所需的类,则as将返回null。所以,实际的错误在于

 DataRowView row = PName.SelectedValue as DataRowView;

尝试使用DataRowView row = (DataRowView)PName.SelectedValue直接投射,你肯定会收到错误。

您应该再次查询数据源以获取数据对象。

答案 5 :(得分:0)

在这个帖子上查看我的通用解决方案:

c# loop through combobox where datasource is a datatable with text

基本上,你可以调用我的函数,告诉它每个ComboBox项的类型,它将完成其余的工作。

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

希望这有帮助!