首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空对象检测

空对象检测
EN

Stack Overflow用户
提问于 2018-08-03 01:48:32
回答 1查看 208关注 0票数 0

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

代码语言:javascript
复制
var objects=Data.GetData(DataFormats.FileDrop, false);

我还可以转换它,并获得所有拖放文件的路径:

代码语言:javascript
复制
string[] DroppedDirectories = (string[])e.Data.GetData(DataFormats.FileDrop, false);

它工作得很好,但当我从浏览器拖放"MyComputer“或其他东西时,我的程序抛出了nullfrefferenceexception。

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

代码语言:javascript
复制
Data.GetData(DataFormats.FileDrop, false);

我假设我必须检查每个对象并消除空对象(然后我可以将不带空对象的数组转换为string [],并且在进一步的处理过程中,我会得到正确的路径,并且没有NRexceptions )。

这段代码仍然抛出System.NullRefferenceException:

代码语言:javascript
复制
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;
        }
   }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-03 02:06:26

我相信我们已经为你回答了这个问题,Yesterday。在对列表项执行任何操作之前,您需要检查列表项。根据Abion47为您链接的文档,您将得到一个null返回。

字符串是可以为空的类型,所以昨天给出的答案仍然有效。如果你不喜欢ListViewItem创建过程中的try catch,你可以像上面那样做,首先检查是否为空。

代码语言:javascript
复制
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
}

here是GetData的文档

它声明它将尝试将其转换为您需要的任何格式。如果不能,那么它将返回null。昨天您想要转换为字符串数组(DataFormat.FileDrop),但它将失败。

今天,您尝试转换为object,但在相同的位置得到了相同的错误。您仍在尝试将其转换为DataFormats.FileDrop,而这正是它返回null的地方。您仍然要求GetData转换为DataFormats.FileDrop,但它不能。

RecycleBin和Desktop是特殊的目录,我假设DrapDrop无法处理它们,因此转换失败并返回null。

我试过了:

代码语言:javascript
复制
var ob = e.Data.GetData(typeof(object));

当您包含回收站时,它仍然返回null。如果您尝试获取数据e.Data.GetType()的数据类型,您会发现数据的类型为:

代码语言:javascript
复制
System.Windows.Forms.DataObject

您可以像以前一样防止null崩溃,也可以使用:

代码语言:javascript
复制
if (e.Data.GetDataPresent(DataFormats.FileDrop)

这将检查数据是否可以格式化为您想要的类型。但是它不能告诉你里面到底是什么类型的数据!

不幸的是,无论你做什么,包含RecycleBin或桌面都会导致转换失败。

你可以随时检查它是否转换,如果它没有弹出一条消息给你的用户,告诉他们不应该尝试删除回收站/桌面:

代码语言:javascript
复制
if (!e.Data.GetDataPresent(DataFormats.FileDrop)
{
    MessageBox("Please don't drop Recycle Bin or Desktop");
    return;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51659511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档