即使对象不为null,仍会发生NullReference异常

4
我是新手wpf;我正在使用可编辑的comboBox(用于搜索目的)。
当ComboBox中的文本更改时,搜索结果将显示在datagrid下方。选择数据表中的任何行后,其值将显示在文本框中进行编辑。
当我在combobox中写入某些内容时,相关行将显示在数据网格中,但是当我单击以选择行时,应用程序会抛出nullreference异常。
当数据网格刷新逻辑位于按钮单击之后时,我的应用程序可以正常工作。
数据网格的“SelectionChange”事件代码如下:
private void CategoryRowSelected(object sender, System.Windows.Controls.SelectedCellsChangedEventArgs e)
{
    ClearForm();

    if(CategoryDataGrid.SelectedItem!=null)
    {
        categoryMember = CategoryDataGrid.SelectedItem as CategoryTbl; // value assigned to the object
        // if (categoryMember != null)
        CategoryName.Text = categoryMember.CategoryName; //Exception thrown on this statement
        CategoryDescription.Text = categoryMember.CategoryDescription;
    }       
}

ComboBox的textChange事件的代码如下:

private void RefreshDataGrid(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
    CategoryDataGrid.SelectedIndex = -1;           
    //CategoryDataGrid.ItemsSource = RefreshQuery;
    CategoryDataGrid.ItemsSource= Admin.RefreshCategoryDataGrid(NameCombo.Text);
}

1
你确定你的转换不会返回空值吗? - Lews Therin
2
如果您将 CategoryDataGrid.SelectedItem 强制转换为 (CategoryTbl),那么使用 as 有何意义呢? - Conrad Frix
2
也许楼主更喜欢获得一个空引用异常(NullReferenceException)而不是一个无效转换异常(InvalidCastException)。 - Reed Copsey
@ReedCopsey 我认为你对 OP 给予了太多的信任。 - paparazzo
谢谢...我明白问题了...类型没有使用'as'运算符进行转换。 - Hafsa Himayat
2个回答

5
 CategoryName.Text = categoryMember.CategoryName; //Exception thrown on this statement

这可能会有多种原因 - 不仅是因为 categoryMember 是 null。还可能发生以下情况:
  • categoryMember.CategoryNameCategoryName 属性本身)返回 null,因为像 TextBox.Text 这样的属性在将值设置为 null 时会引发异常。
  • CategoryName(该控件)为 null

此外,我看到你进行了一个 null 检查(用于调试?),但它被注释掉了。如果 CategoryDataGrid.SelectedItem 不能分配给 CategoryTbl,则 categoryMember 本身将为 null。


注意:C#有一个方便的??运算符,如果左侧参数为null,则返回右侧参数:CategoryName.Text = categoryMember.CategoryName ?? ""; - Olivier Jacot-Descombes
谢谢...我找到问题了...编译器没有报错,是类型冲突的问题。 - Hafsa Himayat

1

除了@Reed的回答之外,考虑到您说在Button点击时它可以工作,我想象Button在单元格上。在这种情况下,返回的类型与CategoryDataGrid.SelectedItem中可能发生的不同。很可能CategoryDataGrid.SelectedItem是某种类型的容器,而不是直接的CategoryTbl类型。

希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接