【问题标题】:NullReferenceException when setting ItemSource ComboBox property [duplicate]设置 ItemSource ComboBox 属性时出现 NullReferenceException [重复]
【发布时间】:2012-07-16 19:39:28
【问题描述】:

可能重复:
What is a NullReferenceException in .NET?

我有两个 ComboBox,一个是公司,另一个是区域(意味着每个公司都有一组区域),我想根据 ComboBox_Company 中设置的公司更改 ComboBox_Region 的 ItemSource。

我有两个类,代表公司和地区,以及一个返回确定公司地区列表的地区类方法(作为参数传递)。

当 ComboBox_Company 所选项目发生更改时,我还触发了一个事件,该事件应重新加载 ComboBox_Region 源。见下文

private void ComboBox_Company_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   Company selected_company= (Company)ComboBox_Company.SelectedValue;
   Dictionary<int, string> regions = Region.GetLookupListByCompanyID(null, selected_company.ID, false);
   ComboBox_Region.ItemsSource = regions.Values;
}

尽管如此,我收到了 NullReferenceException 错误,但我不知道如何解决。

XAML 代码如下:

<TextBlock Grid.Row="0" Grid.Column="0" Text="{x:Static props:ResourcesWPF.Company}" />
<ComboBox Name="ComboBox_Company" Grid.Row="0" Grid.Column="1" DisplayMemberPath="Name" SelectedItem="ID" Initialized="ComboBox_Company_Initialized"  SelectionChanged="ComboBox_Company_SelectionChanged" />

<TextBlock Grid.Row="1" Grid.Column="0" Text="{x:Static props:ResourcesWPF.Region}" />
<ComboBox Name="ComboBox_Region" Grid.Row="1" Grid.Column="1" DisplayMemberPath="Name" SelectedItem="ID" Initialized="ComboBox_Region_Initialized" SelectionChanged="ComboBox_Region_SelectionChanged" />

【问题讨论】:

  • 几乎所有的 NullReferenceException 情况都是一样的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。
  • 调试:检查selected_companyregions是否与Null不同
  • @MBen :不,它们不为空。我会检查一下其他链接。谢谢!
  • 如果您能指出 NRE 正在发生的那一行,那将非常有帮助。
  • @GuilhermeCampos 请给我看它的 xaml

标签: c# wpf combobox nullreferenceexception itemssource


【解决方案1】:

以下变量之一为空

ComboBox_Company
Region
selected_company
selected_company.ID
ComboBox_Region
regions

也许null 符号不是您传递给它的方法所期望的。

你可以使用调试器看看。当抛出异常时,调试器通常会自动启动。在屏幕底部,有 2 个小标签。 localswatch。您可以使用它们来查看变量中的值,并查看其中一个是否为空。

【讨论】:

    【解决方案2】:

    你得到那个异常是因为它是真的......你正在访问一个 NULL 的东西。很可能是 selected_company.ID。

    以下是解决您问题的一些帮助:

    每次您的 ComboBox 的 SelectedValue 发生变化时,您的事件都会触发多次。这包括 SelectedValue 从旧值变为 [empty] 的时间(在变为新值之前)。解决此问题的一种方法是检查您的逻辑是否仅在设置 新值 时运行。将你的逻辑包装在 if 周围:

    if (e.AddedItems.Count > 0)
    {
        //your logic
    }
    

    虽然,实现您所说的更好的方法是不使用 SelectionChanged 事件侦听器,而是利用 WPF 的 {Binding} 引擎。将第二个 ComboBox 的 ItemsSource 绑定到第一个 ComboBox 的 SelectedItem 的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 2013-03-23
      • 1970-01-01
      • 2016-07-31
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多