2015-09-02 81 views
0

我正在努力完成一项我认为很简单的任务。获取拖放数据从资源管理器到Windows窗体的文件名

我有一个Windows Forms应用程序,用C++/CLI编写。我希望用户能够将文件拖放到表单中进行某种处理。

我设置表格行为的AllowDrop的dragenter事件引发。

我如何检索文件名?我看到this example in C#,但没有得到任何运气移植到C++/CLI

这是我的尝试:

private: System::Void tabSingle_DragEnter(System::Object^ sender, 

System::Windows::Forms::DragEventArgs^ e) 
{ 
    if (e->Effect == DragDropEffects::Link) 
    { 
     // This is true 
    } 

    try 
    { 
     String^ filename = (String^) e->Data->GetData("FileName"); 

    } 
    catch(...) 
    { 
     // System.InvalidCastException: Impossible to convert an object of type 'System.String[]' in to'System.String' 
    } 
} 

提前感谢!

编辑:我更新了答案和我收到的例外的描述。看起来像预期的对象是一个System.String []。我应如何修改该行具有相同的行为,因为这行C#(从here

Array data=((IDataObject)e.Data).GetData("FileName") as Array;

+0

“这些总是失败”:*它是如何失败的?你得到的例外是什么? –

+0

更新我的问题,收到的例外 – Lelo

回答

2

在C++/CLI阵列语法array<String^>^ filenames = ...

由于异常告诉你,你有一个字符串数组,直接转换为该类型,而不是泛型类型Array,就像他们在C#示例中那样。 (当然,在使用它之前检查它是一个字符串数组,等等)

+0

谢谢..我现在得到它的工作。只是为了补充......如何在分配之前检查它是一个字符串数组? GetData()文档说它返回一个System :: Object – Lelo

+1

在继续之前执行'dynamic_cast'并检查null。这与C#中的'as'和null检查等价。 (没有直接等价于C#的'is'。)我在我的答案中错过了;现在纠正了。 –

相关问题