在論壇上看見這篇文章
如何提供視覺 C# 應用程式中的檔案拖放功能,才想到之前練習時,並沒有真的了解 DragEnter 內的 Code,代表甚麼意義,趁這個機會了解一下,並延伸這篇文章,拖曳物件假如是資料夾,必須把資料夾內的檔案也列出
using System.IO;
namespace DragDropList
{
public partial class DragDropList : Form
{
public DragDropList()
{
InitializeComponent();
}
private void DragDropList_Load(object sender, EventArgs e)
{
listBox.AllowDrop = true;
listBox.Dock = DockStyle.Fill;
}
private void listBox_DragEnter(object sender, DragEventArgs e)
{
// 判斷物件是否可以拖曳進入控件,EX:垃圾桶無法拖曳進入控件,
// 拖曳過程中可以在控件上透過圖示來顯示該物件是否可以進行拖曳
if (e.Data.GetDataPresent(DataFormats.FileDrop))
// 控件上會出現 + 圖示,DragDrop 才會被觸發
e.Effect = DragDropEffects.All;
else
// 控件上會出現禁止圖示,DragDrop 不會被觸發
e.Effect = DragDropEffects.None;
}
private void listBox_DragDrop(object sender, DragEventArgs e)
{
// 避免重覆操作,無法正確顯示結果
listBox.Items.Clear();
// GetData() 回傳 string[],內容為物件路徑,允許使用者一次拖曳多個物件
string[] entriesPath = (string[])e.Data.GetData(DataFormats.FileDrop,false) ;
foreach (string entryPath in entriesPath)
{
listBox.Items.Add(entryPath);
dirFiles(entryPath);
}
}
private void dirFiles(string _entryPath)
{
DirectoryInfo dirInfo = new DirectoryInfo(_entryPath);
if (dirInfo.Exists == false) return;
// DirectoryInfo.GetFileSystemInfos() 會回傳 Directory 和 File 兩種類型檔案,
// 相當於執行 DirectoryInfo.GetFiles 和 DirectoryInfo.GetDirectories
foreach (FileSystemInfo info in dirInfo.GetFileSystemInfos())
{
listBox.Items.Add(info.FullName);
dirFiles(info.FullName);
}
}
}
}
沒有留言:
張貼留言