拖放文件名可视化(托管)C++

3
我有一个RichTextBox,希望允许用户将磁盘上的文件拖放到其中。文本框中应该显示的仅是文件名。但是,当前的代码在文本框中添加了"System.String[]"而不是文件名。当我将DataFormats::FileDrop更改为DataFormats::Text时,如this MSDN所建议的那样,我会得到一个NULL解引用错误。
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);
}

没错,我正在使用FileDrop。问题是它打印出的是“System.String []”,而不是文件名。我真的很想得到文件名。 - Goodies
你手头有例子吗? - Goodies
LoadFile函数以文件路径作为参数。此外,^str变量显然不是数组。 - Goodies
1个回答

5
拖动文件总是会产生一个字符串数组。每个数组元素都是拖动的其中一个文件的路径。您需要编写额外的代码将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));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接