4

用户可以单击 ListBox 中的项目,如下所示:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    textBox2.Clear();
    listBox2.Items.Clear();

    string[] p = 
         Directory.GetFiles(
             textBoxDir.Text, 
             listBox1.SelectedItem.ToString(),
             SearchOption.AllDirectories);

    foreach (string open in p) 
        ......
}

一切皆好。但是,如果用户单击 ListBox 中的空白区域,则会显示以下错误:

System.NullReferenceException

这是因为这行代码:

string[] p = 
    Directory.GetFiles(
        textBoxDir.Text, 
        listBox1.SelectedItem.ToString(),   
        SearchOption.AllDirectories);

有没有人有聪明的工作?或者建议替代我的代码?

4

6 回答 6

11

解决方法是检查空值并提前退出。

if (listBox1.SelectedItem == null)
{
    return;
}

这避免了其他答案引入的嵌套,这使代码的可读性降低。

于 2013-04-27T17:30:02.783 回答
4

您可以SelectedIndex在该行之前检查:

if(listBox2.SelectedIndex < 0)
    return;
于 2013-04-27T17:29:28.970 回答
1

做一个怎么样

if(listBox1.SelectedItem != null){
    // ... do your work with listBox1.SelectedItem here
}

这应该可以防止该错误发生。

于 2013-04-27T17:29:20.853 回答
1

怎么样

if (listBox1.SelectedItem != null)
{
    string[] p = Directory.GetFiles(textBoxDir.Text, listBox1.SelectedItem.ToString(),   SearchOption.AllDirectories);
}

完整代码

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listBox1.SelectedItem != null)
    {    
        textBox2.Clear();
        listBox2.Items.Clear();

        string[] p = Directory.GetFiles(textBoxDir.Text, listBox1.SelectedItem.ToString(), SearchOption.AllDirectories);

        foreach (string open in p) 
         ...... }
    }
}
于 2013-04-27T17:29:48.470 回答
1

在调用此行之前先检查 listbox1.SelectedItem 是否为空:

string[] p = Directory.GetFiles(textBoxDir.Text, listBox1.SelectedItem.ToString(),   SearchOption.AllDirectories);
于 2013-04-27T17:30:56.250 回答
-1

但是,这些都不允许您返回并从列表框中重新选择。仍在处理该问题 - 将更新。

while (user == null) {
    try {
        user = this.lstAdministratorName.SelectedItem.ToString();
    } catch { 
        lstAdministratorName.ClearSelected(); 
        return; 
    }
}
于 2015-11-13T16:55:07.630 回答