2017-03-16 78 views
2

我不知道,为什么我的程序崩溃。C#程序崩溃组合框SelectedItem ToString

如果我点击 “刷新” 按钮:

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

你有没有试着用一个try catch子句,以获得有关错误的详细信息包围你的代码? –

+1

可能重复[什么是NullReferenceException,以及如何解决它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it ) – Sinatr

回答

4

comboFilter_SelectionChanged在重新加载后以某种方式启动,您从combo中删除项目,这是清除方法的结果。在使用之前,请确保在comboFilter_SelectionChanged中有SelectedItem不为空。

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会向用户显示未处理的异常信息并停止执行程序。

+0

Thx为答案。它现在有效。即时通讯新的C#很抱歉^^ –

+0

不客气@OJean,没问题。这是学习过程的一部分。 – Adil

0

您可能希望为comboFilter.SelectedItem添加空值检查,例如, like comboFilter.SelectedItem?.ToString()

1

由于comboFilter_SelectionChanged在调用comboFilter.Items.Clear()时从reloadBtn_Click隐式调用,所以抛出异常。在这种情况下,comboFilter.SelectedItem从先前选择的项目更改为null

comboFilter_SelectionChanged检查null

private void comboFilter_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (comboFilter.SelectedItem != null) 
    { 
     labelfilter.Content = "Filter: " + comboFilter.SelectedItem; 
     filtervalue = comboFilter.SelectedItem.ToString(); 
    } 
}