我不知道,为什么程序崩溃。
如果我点击"重新加载"按钮:
private void reloadBtn_Click(object sender, RoutedEventArgs e)
{
comboFilter.Items.Clear();
dataGridPrivatecustomers.Columns.Clear();
dataGridPrivatecustomers.ItemsSource = null;
load_columns_privatecustomer();
load_values_privatecustomer();
}
一切正常。 但是如果我为我的搜索功能选择一个过滤器并单击重新加载,那么它会崩溃:
private void comboFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
labelfilter.Content = "Filter: " + comboFilter.SelectedItem;
filtervalue = comboFilter.SelectedItem.ToString();
}
这是断点:
filtervalue = comboFilter.SelectedItem.ToString();
我得到一个NulLReferenceException错误。
我试着在reloadBtn_Click中创建一个filtervalue = null;
,但也没有工作。
答案 0 :(得分:4)
comboFilter_SelectionChanged
在重新加载后以某种方式触发,您从combo
中移除项目,这是明确方法的结果。在使用之前,请确保SelectedItem
中的comboFilter_SelectionChanged
不为空。
private void comboFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if( comboFilter.SelectedItem != null)
{
labelfilter.Content = "Filter: " + comboFilter.SelectedItem;
filtervalue = comboFilter.SelectedItem.ToString();
}
}
作为补充说明,您的程序不会因为没有捕获程序中抛出的异常而崩溃。使用try-catch来正确处理异常。并且在它们发生之前也尽量避免它们。就像我们在这里检查null一样。这样可以防止程序崩溃。
try-catch (C# Reference) - 为什么程序会崩溃(停止执行)
抛出异常时,公共语言运行库(CLR)看起来如此 用于处理此异常的catch语句。如果是目前的 执行方法不包含这样的catch块,CLR查看 调用当前方法的方法,依此类推 堆。如果未找到catch块,则CLR显示未处理 向用户发出异常消息并停止执行程序。
答案 1 :(得分:1)
抛出异常是因为调用comboFilter_SelectionChanged
时reloadBtn_Click
会隐式调用comboFilter.Items.Clear()
。在这种情况下,comboFilter.SelectedItem
会从之前选择的项目更改为null
。
在null
中检查comboFilter_SelectionChanged
:
private void comboFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (comboFilter.SelectedItem != null)
{
labelfilter.Content = "Filter: " + comboFilter.SelectedItem;
filtervalue = comboFilter.SelectedItem.ToString();
}
}
答案 2 :(得分:0)
您可能想要为comboFilter.SelectedItem添加空值检查,例如比如comboFilter.SelectedItem?.ToString()