1

我在鼠标双击时有一个列表视图我正在尝试获取所选项目的名称和路径,我编写了以下代码但我收到“System.NullReferenceException”错误

public class Listview_data
{
    public string name
    {
        get;
        set;
    }
    public ImageSource Image
    {
        get;
        set;
    }
    public string path
    {
        get;
        set;
    }
};


private void ListView_MouseDClick(object sender, MouseButtonEventArgs e)
{
    Listview_data lvd = null;
    lvd = DocsListView.SelectedItem as Listview_data;
    MessageBox.Show(lvd.name);
}

我附上了调试的截图 在此处输入图像描述

4

3 回答 3

3

根据截图DocsListView.SelectedItem是类型SimpleCube.Documents

所以在这行代码lvd为空之后

lvd = DocsListView.SelectedItem as Listview_data;

NullReferenceException访问时会抛出以下代码行lvd.name

MessageBox.Show(lvd.name)

所以首先修复你的绑定

于 2013-10-28T11:52:35.097 回答
1

根据发布的调试图像,您的代码应该是

private void ListView_MouseDClick(object sender, MouseButtonEventArgs e)
{
    SimpleCube.Documents lvd = null;
    lvd = DocsListView.SelectedItem as SimpleCube.Documents;
    if(lvd != null)
        MessageBox.Show(lvd.Name);
}

或者,也许应该将 ListView 的 Datasource 设置更改为 Listview_Data 对象列表。

于 2013-10-28T11:51:44.920 回答
0

例如,您应该在使用之前检查 SelectedItem 是否为空;

private void ListView_MouseDClick(object sender, MouseButtonEventArgs e)
{
    Listview_data lvd = null;
    lvd = DocsListView.SelectedItem as Listview_data;
    if (lvd == null)
    {
        MessageBox.Show("You should only double click on an item");
        return;
    }

    MessageBox.Show(lvd.name);
}

如果没有选择任何项目,SelectedItem 属性可能会返回 null。此外,通过使用“as”进行强制转换,如果对象不是正确的类型,您还可以稍后获得空引用异常,尽管在这种情况下这可能不是一种可能的情况。

John Skeet 写了一篇关于使用 'as' 进行类型转换和检查 null 的好文章,绝对值得一读(Casting vs "as" - embracing exceptions)。

于 2013-10-28T11:51:48.070 回答