在我的拖放列表视图中,我通过以下方式收集拖放的文件:
var objects=Data.GetData(DataFormats.FileDrop, false);我还可以转换它,并获得所有拖放文件的路径:
string[] DroppedDirectories = (string[])e.Data.GetData(DataFormats.FileDrop, false);它工作得很好,但当我从浏览器拖放"MyComputer“或其他东西时,我的程序抛出了nullfrefferenceexception。
我的问题是下面的Get data方法的确切返回值是多少(当我在某个时刻拖放几个文件时):
Data.GetData(DataFormats.FileDrop, false);我假设我必须检查每个对象并消除空对象(然后我可以将不带空对象的数组转换为string [],并且在进一步的处理过程中,我会得到正确的路径,并且没有NRexceptions )。
这段代码仍然抛出System.NullRefferenceException:
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;
}
}发布于 2018-08-03 02:06:26
我相信我们已经为你回答了这个问题,Yesterday。在对列表项执行任何操作之前,您需要检查列表项。根据Abion47为您链接的文档,您将得到一个null返回。
字符串是可以为空的类型,所以昨天给出的答案仍然有效。如果你不喜欢ListViewItem创建过程中的try catch,你可以像上面那样做,首先检查是否为空。
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。
我试过了:
var ob = e.Data.GetData(typeof(object));当您包含回收站时,它仍然返回null。如果您尝试获取数据e.Data.GetType()的数据类型,您会发现数据的类型为:
System.Windows.Forms.DataObject您可以像以前一样防止null崩溃,也可以使用:
if (e.Data.GetDataPresent(DataFormats.FileDrop)这将检查数据是否可以格式化为您想要的类型。但是它不能告诉你里面到底是什么类型的数据!
不幸的是,无论你做什么,包含RecycleBin或桌面都会导致转换失败。
你可以随时检查它是否转换,如果它没有弹出一条消息给你的用户,告诉他们不应该尝试删除回收站/桌面:
if (!e.Data.GetDataPresent(DataFormats.FileDrop)
{
MessageBox("Please don't drop Recycle Bin or Desktop");
return;
}https://stackoverflow.com/questions/51659511
复制相似问题