天天看點

C#實作外部圖檔的拖拽到應用程式的簡單功能,附全部源碼,供有需要的參考

通用權限管理系統元件源碼裡,有職員管理的功能,實作了直接可以把照片拖拽過來的功能,用起來會很友善。

管理軟體能支援拖拽功能,會好用很多,使用者體驗也會改善很多。想做好一個元件需要把放放面面都徹底做好才可以。

想要控件支援拖拽,需要設定 AllowDrop 屬性。

還需要寫下面的2個事件。

參考代碼如下,有需要的可以參考一下,把有需要的代碼參考一下就可以了。

代碼

//-----------------------------------------------------------

// All Rights Reserved , Copyright (C) 2010 ,Jirisoft , Ltd .

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace DotNet.WinForm.File

{

    using DotNet.Model;

    using DotNet.Utilities;

    using DotNet.Service;

    /// <summary>

    /// UCPicture

    /// 照片顯示控件

    /// 

    /// 修改紀錄

    ///

    ///        2010.12.08 版本:2.0 JiRiGaLa 更新員工更新照片的錯誤。

    ///        2008.04.29 版本:1.0 JiRiGaLa 建立。

    ///        

    /// 版本:2.0

    /// <author>

    ///        <name>JiRiGaLa</name>

    ///        <date>2010.12.08</date>

    /// </author> 

    /// </summary>

    public partial class UCPicture : UserControl

    {

        public UCPicture()

        {

            InitializeComponent();

        }

        private BaseUserInfo userInfo = new BaseUserInfo();

        /// <summary>

        /// 目前操作員資訊

        /// </summary>

        public BaseUserInfo UserInfo

            get

            {

                userInfo = new BaseUserInfo();

                userInfo.GetUserInfo();

                return userInfo;

            }

            set

                userInfo = value;

        /// 儲存到資料庫

        public bool FromDatabase = true;

        private string fileId = string.Empty;

        public string FileId

                return this.fileId;

                this.fileId = value;

                this.ShowPicture();

        private string folderId = string.Empty;

        public string FolderID

                return this.folderId;

                this.folderId = value;

        private void UCPicture_Load(object sender, EventArgs e)

            // 設定按鈕狀态

            // this.SetControlState();

        private void UCPicture_DragOver(object sender, DragEventArgs e)

            if (e.Data.GetDataPresent(DataFormats.FileDrop))

                e.Effect = DragDropEffects.Move;

        private void UCPicture_DragDrop(object sender, DragEventArgs e)

                string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);

                for (int i = 0; i <= file.Length - 1; i++)

                {

                    if (System.IO.File.Exists(file[i]))

                    {

                        this.fileId = string.Empty;

                        // 設定顯示的圖檔

                        this.pic.ImageLocation = file[i];

                        // 設定按鈕狀态

                        this.SetControlState();

                        break;

                    }

                }

        /// 顯示圖檔

        public void ShowPicture()

            if (!String.IsNullOrEmpty(this.FileId))

                // 顯示圖檔

                this.ShowPicture(this.FileId);

            else

                // 清除圖檔

                this.ClearPicture();

        /// <param name="id">主鍵</param>

        private void ShowPicture(string id)

            if (!this.FromDatabase)

                this.pic.ImageLocation = BaseSystemInfo.StartupPath + id;

                byte[] fileContent = null;

                fileContent = this.Download(id);

                if (fileContent != null)

                    // this.pic.Image = this.ByteToImage(fileContent);

                    MemoryStream memoryStream = new MemoryStream(fileContent);

                    Bitmap bitmap = new Bitmap(memoryStream);

                    this.pic.Image = bitmap;

                else

                    this.FileId = string.Empty;

                    this.ClearPicture();

            this.SetControlState();

        /// 從資料庫中讀取檔案

        /// <param name="id">檔案主鍵</param>

        /// <returns>檔案</returns>

        public byte[] Download(string id)

            return ServiceManager.Instance.FileService.Download(UserInfo, id);

            // OleDbHelper dbHelper = new SqlHelper();

            // dbHelper.Open();

            // byte[] fileContent = null;

            // string sqlQuery = " SELECT " + BaseFileTable.FieldFileContent

            //                + "   FROM " + BaseFileTable.TableName

            //                + "  WHERE " + BaseFileTable.FieldId + " = '" + Id + "'";

            // OleDbDataReader dataReader = (OleDbDataReader)dbHelper.ExecuteReader(sqlQuery);

            // if (dataReader.Read())

            // {

            //    fileContent = (byte[])dataReader[BaseFileTable.FieldFileContent];

            // }

            // dbHelper.Close();

            // return fileContent;

        public string Upload(string folderId, string categoryId)

            this.FolderID = folderId;

            string returnValue = string.Empty;

            if (!String.IsNullOrEmpty(this.pic.ImageLocation))

                // 儲存到資料庫

                if (this.FromDatabase)

                    if (String.IsNullOrEmpty(this.FileId))

                        returnValue = ServiceManager.Instance.FileService.Upload(UserInfo, folderId, Path.GetFileName(this.pic.ImageLocation), FileUtil.GetFile(this.pic.ImageLocation), true);

                    else

                        string statusCode = string.Empty;

                        string statusMessage = string.Empty;

                        ServiceManager.Instance.FileService.UpdateFile(UserInfo, this.FileId, Path.GetFileName(this.pic.ImageLocation), FileUtil.GetFile(this.pic.ImageLocation), out statusCode, out statusMessage);

                        returnValue = this.FileId;

                    // 複制檔案到指定的目錄裡

                    if (!this.pic.ImageLocation.Equals(BaseSystemInfo.StartupPath + this.FileId))

                        string destDirectory = BaseSystemInfo.StartupPath + "\\UploadFiles" + "\\" + folderId + "\\" + categoryId;

                        System.IO.Directory.CreateDirectory(destDirectory);

                        string destFileName = destDirectory + "\\" + Path.GetFileName(this.pic.ImageLocation);

                        System.IO.File.Copy(this.pic.ImageLocation, destFileName);

                        returnValue = "\\UploadFiles" + "\\" + folderId + "\\" + categoryId + "\\" + Path.GetFileName(this.pic.ImageLocation);

                // OleDbHelper dbHelper = new SqlHelper();

                // dbHelper.Open();

                // string sequence = BaseSequenceManager.Instance.GetSequence(DbHelper, BaseFileTable.TableName);

                // OleDbSQLBuilder sqlBuilder = new OleDbSQLBuilder();

                // sqlBuilder.BeginInsert(DbHelper, BaseFileTable.TableName);

                // sqlBuilder.SetValue(BaseFileTable.FieldId, sequence);

                // sqlBuilder.SetValue(BaseFileTable.FieldFolderId, folderId);

                // sqlBuilder.SetValue(BaseFileTable.FieldFileName, Path.GetFileName(this.pic.ImageLocation));

                // // byte[] File = this.ImageToByte(this.pic.Image);

                // byte[] File = this.GetFile(this.pic.ImageLocation);

                // sqlBuilder.SetValue(BaseFileTable.FieldFileContent, File);

                // sqlBuilder.SetValue(BaseFileTable.FieldFileSize, File.Length);

                // sqlBuilder.SetValue(BaseFileTable.FieldCreateUserId, UserInfo.Id);

                // sqlBuilder.SetDBNow(BaseFileTable.FieldCreateDate);

                // sqlBuilder.EndInsert();

                // dbHelper.Close();

                // returnValue = sequence;

            return returnValue;

        private void SetControlState(bool enabled)

            this.btnSelect.Enabled  = enabled;

            this.btnClear.Enabled   = enabled;

            this.btnDelete.Enabled  = enabled;

        #region private void SetControlState() 設定按鈕狀态

        /// 設定按鈕狀态

        private void SetControlState()

            this.btnSelect.Enabled = true;

            // 是從資料庫裡面讀取出來的

            if (!String.IsNullOrEmpty(this.FileId) && (String.IsNullOrEmpty(this.pic.ImageLocation) || !this.FromDatabase))

                this.btnDelete.Enabled = true;

                this.btnDelete.Enabled = false;

            // 清除按鈕

            this.btnClear.Enabled = false;

                    this.btnClear.Enabled = true;

                    this.btnDelete.Enabled = false;

                        this.btnClear.Enabled = true;

                        this.btnDelete.Enabled = false;

        #endregion

        private void pic_DoubleClick(object sender, EventArgs e)

            if (this.pic.Image != null)

                FrmPicture frmPicture = new FrmPicture(this.FileId);

                frmPicture.SetImage(this.pic.Image);

                frmPicture.Show();

        }        

        private void btnSelect_Click(object sender, EventArgs e)

            OpenFileDialog openFileDialog = new OpenFileDialog();

            // OpenFileDialog.InitialDirectory = Application.StartupPath;

            openFileDialog.Filter = "位圖檔案(*.bmp)|*.bmp|JPEG(*.JPG;*.JPEG;*.JPE;*.JFIF)|*.JPG;*.JPEG;*.JPE;*.JFIF|GIF(*.GIF)|*.GIF|TIFF(*.TIF;*.TIIF)|*.TIF;*.TIIF|PNG(*.PNG)|*.PNG|ICO(*.ICO)|*.ICO|所有圖檔檔案|(*.bmp;*.JPG;*.JPEG;*.JPE;*.JFIF;*.GIF;*.TIF;*.TIIF;*.PNG;*.ICO)|所有檔案|*.*";

            openFileDialog.FilterIndex = 7;

            openFileDialog.RestoreDirectory = true;

            openFileDialog.Title = "打開圖檔檔案";

            if (openFileDialog.ShowDialog() == DialogResult.OK)

                this.fileId = string.Empty;

                this.SetControlState(false);

                this.pic.ImageLocation = openFileDialog.FileName;

                // 設定按鈕狀态

                this.SetControlState();

        /// 清除圖檔

        private void ClearPicture()

            this.pic.ImageLocation = string.Empty;

            this.pic.Image = null;

        private void btnClear_Click(object sender, EventArgs e)

            this.ClearPicture();

            this.ShowPicture();

        /// 删除檔案

        /// <returns>影響的行數</returns>

        public int DeleteFile(string id)

            int returnValue = 0;

            if (this.FromDatabase)

                // 從資料庫伺服器删除檔案

                returnValue = ServiceManager.Instance.FileService.Delete(UserInfo, id);

                // 删除檔案

                System.IO.File.Delete(BaseSystemInfo.StartupPath + this.FileId);

        private void btnDelete_Click(object sender, EventArgs e)

            if (MessageBox.Show(AppMessage.MSG0207, AppMessage.MSG0000, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)

                this.DeleteFile(this.FileId);

                this.FileId = string.Empty;

        }    

    }

}

 本文轉自jirigala_bao 51CTO部落格,原文連結:http://blog.51cto.com/jirigala/809334