2016-02-01 34 views
1

我有一个RichTextBox,我想允许用户将文件从磁盘拖放到。所有应该出现在文本框中的是文件名。此代码当前将"System.String[]"添加到文本框而不是文件名。当我将DataFormats::FileDrop更改为DataFormats::Text,因为this MSDN似乎暗示,我得到一个NULL解引用错误。拖放文件名Visual(托管)C++

RichTextBox名称是rtbFile。在我的构造函数中,我有:

this->rtbFile->AllowDrop = true; 

我设置这样的事件(InitializeComponents内):

this->rtbFile->DragEnter += gcnew System::Windows::Forms::DragEventHandler(this, &VanicheMain::rtbFile_DragEnter); 
this->rtbFile->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &VanicheMain::rtbFile_DragDrop); 

的功能定义如下:

void rtbFile_DragEnter(System::Object ^sender, System::Windows::Forms::DragEventArgs^e) { 
    if (e->Data->GetDataPresent(DataFormats::FileDrop)) 
     e->Effect = DragDropEffects::Copy; 
    else 
     e->Effect = DragDropEffects::None; 
} 

System::Void rtbFile_DragDrop(System::Object ^sender, System::Windows::Forms::DragEventArgs ^e){ 
    int i = rtbFile->SelectionStart;; 
    String ^s = rtbFile->Text->Substring(i); 
    rtbFile->Text = rtbFile->Text->Substring(0, i); 
    String ^str = String::Concat(rtbFile->Text, e->Data->GetData(DataFormats::FileDrop)->ToString()); 
    rtbFile->Text = String::Concat(str, s); 
} 
+0

对,我正在使用FileDrop。问题是它打印出“System.String []”而不是文件名。我真的很想获得文件名。 – Goodies

+0

你能举个例子吗? – Goodies

+0

LoadFile函数将文件路径作为参数。另外,^ str变量显然不是一个数组。 – Goodies

回答

2

文件拖动总是产生一个字符串数组。每个数组元素是被拖动的其中一个文件的路径。您需要编写额外的代码来将GetData()的返回值转换为数组并对其进行迭代,从而读取每个文件的内容。类似于:

array<String^>^ paths = safe_cast<array<String^>^>(e->Data->GetData(DataFormats::FileDrop)); 
for each (String^ path in paths) { 
    String^ ext = System::IO::Path::GetExtension(path)->ToLower(); 
    if (ext == ".txt") rtbFile->AppendText(System::IO::File::ReadAllText(path)); 
} 
+0

我写了几乎完全相同的东西,正在根据您的意见回答我自己的问题。我得到了它的工作。谢谢。 – Goodies