【问题标题】:NullReference exception occurs even when the object is not null即使对象不为空,也会发生 NullReference 异常
【发布时间】:2012-09-26 17:26:47
【问题描述】:

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

当 ComboBox 中的文本发生更改时,搜索结果将显示在数据网格下方。 When any row from the datagrid is selected its values are displayed in textboxes for editing.

当我在组合框中写一些东西时,相关的行会显示在数据网格中,但是当我单击选择一行时,应用程序会抛出一个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);
}

【问题讨论】:

  • 你确定你的演员表不返回 null 吗?
  • 如果你已经使用(CategoryTbl)CategoryDataGrid.SelectedItem (CategoryTbl)CategoryDataGrid.SelectedItem ,你为什么还要使用as
  • @ConradFrix 也许 OP 更喜欢获得 NullReferenceException 而不是 InvalidCastException ;)
  • @ReedCopsey 我认为你对 OP 给予了太多的信任。
  • 谢谢...我遇到了问题...类型未使用“as”运算符进行转换..

标签: c# wpf datagrid event-handling


【解决方案1】:
 CategoryName.Text = categoryMember.CategoryName; //Exception thrown on this statement

这可能有多种原因 - 不仅仅是因为 categoryMember 为空。如果出现以下情况,也会发生这种情况:

  • categoryMember.CategoryNameCategoryName 属性本身)返回 null,因为如果您将值设置为 nullTextBox.Text 和类似属性会引发异常。
  • CategoryName(控制)是null

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

【讨论】:

  • 注意:C# 有方便的??-operator,如果左边的参数为空,则返回右边的参数:CategoryName.Text = categoryMember.CategoryName ?? "";
  • 谢谢...我遇到了问题...编译器没有给出错误。存在类型冲突。
【解决方案2】:

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-05-24
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多