C# 零目标检测

C# 零目标检测,c#,arrays,winforms,nullreferenceexception,nullable,C#,Arrays,Winforms,Nullreferenceexception,Nullable,在我的拖放列表视图中,我通过以下方式收集拖放的文件: var objects=Data.GetData(DataFormats.FileDrop, false); 我还可以强制转换此文件,并获取所有拖放文件的路径: string[] DroppedDirectories = (string[])e.Data.GetData(DataFormats.FileDrop, false); 它工作正常,但当我从Webbrowser拖放“MyComputer”或其他东西时,我的程序抛出nullfref

在我的拖放列表视图中,我通过以下方式收集拖放的文件:

var objects=Data.GetData(DataFormats.FileDrop, false);
我还可以强制转换此文件,并获取所有拖放文件的路径:

string[] DroppedDirectories = (string[])e.Data.GetData(DataFormats.FileDrop, false);
它工作正常,但当我从Webbrowser拖放“MyComputer”或其他东西时,我的程序抛出nullfrefferenceexception

我的问题是下面Get data方法的确切返回值是多少(当我在一瞬间拖放几个文件时)?:

我假设我必须检查每个对象并消除空对象(然后我可以将没有空对象的数组强制转换为string[],并且在进一步处理过程中获得正确的路径和无异常)

此代码仍引发System.NullRefReferenceException:

private void Directories_ListView_DragDrop(object sender, DragEventArgs e)
{
    object[] rawArray=(object[])e.Data.GetData(DataFormats.FileDrop, false);
    foreach (var s in rawArray)\\System.NullRefferenceException occurs..
    {
        try
        {
            if (!s.Equals(null))
            {
                LogList.Items.Add(DateTime.Now + " Item isnt Null");
            }
        }
        catch (Exception)
        {
            LogList.Items.Add(DateTime.Now + " Item is null");
            continue;
        }
   }

我相信我们已经为你回答了这个问题。在处理列表项之前,您需要先检查它们。根据Abion47为您链接的文档,您将得到一个空值

字符串是可为空的类型,因此昨天给出的答案仍然有效。如果您不喜欢在ListViewItem创建过程中使用try-catch,您可以始终按照上面的方法首先检查null

if (e.Data.GetData(DataFormats.FileDrop, false) != null)
{
    string[] DroppedDirectories = (string[]) e.Data.GetData(DataFormats.FileDrop,false);
    List<string> directories = new List<string>();
    foreach(string dir in DroppedDirectories)
    {
        if (dir != null)
            directories.Add(dir);
    }

    // Now loop over the directories list which is guaranteed to have valid string items
}
当包含回收站时,它仍然返回null。如果尝试获取数据的数据类型
e.data.GetType()
,您会发现数据的类型为:

System.Windows.Forms.DataObject
您可以像以前一样或使用以下方法防止空崩溃:

if (e.Data.GetDataPresent(DataFormats.FileDrop)
这将检查数据是否可以格式化为所需的类型。但它不能告诉你里面到底是什么类型的数据

可悲的是,无论你做什么,包括可回收的BIN或桌面在内的转换都会失败

您可以随时检查它是否转换,以及它是否向您的用户弹出一条消息,说明他们不应尝试删除回收站/桌面:

if (!e.Data.GetDataPresent(DataFormats.FileDrop)
{
    MessageBox("Please don't drop Recycle Bin or Desktop");
    return;
}

我认为您的问题在于表达式
s.Equals(null)
,它要求
s
不能为null才能工作。尝试
Equals(s,null)
s==null
,它们是
静态的
,不基于实例。如果使用C#7,
s为null
也会起作用,可能会更有效。我几乎理解你的观点,但当你拖放几个元素(例如2个文件夹+我的电脑)时,什么都不会被处理。当“mycomputer”元素与其他元素一起被删除时,它似乎总是由e.Data.GetData方法返回null。这就是为什么我没有得到这个方法返回的确切内容,以及如何测试它得到的每个元素。为了解决我的问题,我必须检测e.Data.GetData获得的每个空元素,但我不知道如何执行。这是问题的核心。我明白你现在的意思了。我已经更新了上面的答案。恐怕预后不好,所以我没有这个方法。当其中一个元素(如我的计算机、bin等)无法识别时,它总是返回null。另一方面,您可以将其强制转换为字符串数组等的System.object数组。。。在这里,我想我将能够检测到空对象,但这似乎是不可能的@Abion47说了很多有用的东西,但这就是我的问题所在;)我尝试在if(e.Data.GetDataPresent)上设置一个断点,以查看它是否会显示其中的数据类型,但即使这样也不会给出任何线索。抱歉。别担心,我的应用程序仍能工作。我没有更多的想法,但时间不够。找到解决办法后我会通知你的。感谢您的贡献:)
if (e.Data.GetDataPresent(DataFormats.FileDrop)
if (!e.Data.GetDataPresent(DataFormats.FileDrop)
{
    MessageBox("Please don't drop Recycle Bin or Desktop");
    return;
}