天天看点

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