星期二, 6月 11, 2013

[C#] 拖放應用 - TextBox

把記事本拖放至 TextBox 內並顯示資料。

using System.IO; // 必須引用此命名空間

namespace WindowsFormsApplication1
{
    public partial class DragDropText : Form
    {
        public DragDropText()
        {
            InitializeComponent();
        }

        private void DragDropText_Load(object sender, EventArgs e)
        {
            // 允許 textbox 可以拖放
            txtContent.AllowDrop = true;
        }

        private void txtContent_DragEnter(object sender, DragEventArgs e)
        {

            // 判斷
            // 1. 是否有拖曳物件
            // 2. 該物件是否無 txt 檔案
            // 3. 是不是 DataFormats.FileDrop
            bool fileformatCheck = e.Data.GetDataPresent(DataFormats.FileDrop);
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            if
            (
            fileformatCheck == false ||
            files == null || files.Length == 0 ||
            Path.GetExtension(files[0]).ToUpperInvariant() != ".TXT"
            )
            {
                // 當 e.Effect = DragDropEffects.None 時,DragDrop 事件不會被觸發
                e.Effect = DragDropEffects.None;
            }
            else
            {
                // 當 e.Effect = DragDropEffects.Copy (非DragDropEffects.None)時,DrapDrop 事件會被觸發,且 TextBox 上的拖曳符號會變成 +
                e.Effect = DragDropEffects.Copy;
            }
        }

        private void txtContent_DragDrop(object sender, DragEventArgs e)
        {
   
            // 已經在 DrapEnter 內進行防呆,DrapDrop 內就直接抓取資料
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            string filepath = files[0];
            FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
            // Encoding.Default 可以避免內容產生亂碼
            StreamReader sr = new StreamReader(fs, Encoding.Default);
            txtContent.Text = sr.ReadToEnd();
        }
    }
}
文字檔案(預設編碼為 ANSI)編碼格式與 Stream 必須一致才能正確顯示文字,因此產生 StreamReader 時,指定 Encoding.Default 來避免亂碼產生。
[C#] 拖放應用 - TextBox

沒有留言:

張貼留言