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

时间:2012-09-25 18:55:56

标签: c# wpf datagrid event-handling

我是wpf的新手;我正在使用可编辑的comboBox(用于搜索目的)。

当更改ComboBox中的文本时,搜索结果将显示在数据网格下方。当选择数据网格中的任何行时,其值将显示在文本框中以进行编辑。

当我在组合框中写东西时,相关的行显示在数据网格中,但是当我单击以选择一行时,应用程序会抛出nullreference exception

当dataGrid刷新逻辑位于按钮单击后面时,我的应用程序正常工作。

dataGrid的“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);
}

2 个答案:

答案 0 :(得分:5)

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

这可能由于多种原因而发生 - 不仅仅是因为categoryMember为空。如果出现这种情况:

  • categoryMember.CategoryNameCategoryName属性本身)返回nullTextBox.Text,如果将值设置为null,类似的属性会引发异常。< / LI>
  • CategoryName(对照)为null

另外,我看到你有一个null检查(用于调试?),但它被注释掉了。如果CategoryDataGrid.SelectedItem无法分配给CategoryTbl,您将在categoryMember内收到空。

答案 1 :(得分:1)

除了@Reed的回答会说,考虑到你说Button点击它有效,我想象Button在单元格上。在这种情况下,返回的类型与CategoryDataGrid.SelectedItem中可能发生的不同。最可能的CategoryDataGrid.SelectedItem是某种类型的容器,而不是直接属于某种类型CategoryTbl

希望这有帮助。