星期一, 11月 10, 2014

[C#] 拖放應用 - ListBox

在論壇上看見這篇文章 如何提供視覺 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);
            }
        }
    }
}
[C#] 拖放應用 - ListBox

沒有留言:

張貼留言