【问题标题】:Object reference not set to an instance of an object in ComboBox对象引用未设置为 ComboBox 中对象的实例
【发布时间】:2011-08-10 07:16:54
【问题描述】:

我在绑定到数据源的 Windows 表单中使用了组合框,每当表单加载时,它都会正确返回与组合框中特定名称相关联的 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
}

谁能告诉我如何解决这个问题?

【问题讨论】:

  • PName.SelectedValue 是什么?
  • @V4Vendetta:实际上是 'combobox1'
  • @Dusk 查看我的帖子并尝试使用可用的属性,这应该会为您提供所需的值
  • 顺便说一句,在设置 DataSource 之前设置 DisplayMember 和 ValueMember 属性 - 每次更改 Display/Value 成员时,都会重新绑定数据源。

标签: c# .net winforms combobox


【解决方案1】:

我认为您应该检查 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);
    }
}

【讨论】:

    【解决方案2】:

    你应该检查这样的值

    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】:

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

      as 运算符类似于强制转换操作。但是,如果转换 不可能,因为返回 null 而不是引发异常。

      您是否检查过此表达式作为类型是否有效?

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您正在尝试使用“安全转换”将“字符串”类型的 PName.SelectedValue 转换为对象 DataRowView\。 as 如果无法将对象转换为所需的类,则返回 null。所以,实际的错误在

           DataRowView row = PName.SelectedValue as DataRowView;
          

          试试用DataRowView row = (DataRowView)PName.SelectedValue直接投,肯定会报错。

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

          【讨论】:

            【解决方案6】:

            在这个线程上查看我的通用解决方案:

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

            基本上,您可以调用我的函数,告诉它每个 ComboBox 项的类型,然后它会完成剩下的工作。

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

            希望这会有所帮助!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-03-20
              • 2019-06-22
              相关资源
              最近更新 更多