2015-09-02 78 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'。)我在我的答案中錯過了;現在糾正了。 –

相關問題