C#实现外部图片的拖拽到应用程序的简单功能,附全部源码,供有需要的参考
2010-12-08 11:09 通用C#系统架构 阅读(6558) 评论(37) 编辑 收藏 举报通用权限管理系统组件源码里,有职员管理的功能,实现了直接可以把照片拖拽过来的功能,用起来会很方便。
管理软件能支持拖拽功能,会好用很多,用户体验也会改善很多。想做好一个组件需要把放放面面都彻底做好才可以。
想要控件支持拖拽,需要设置 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;
}
}
/// <summary>
/// 保存到数据库
/// </summary>
public bool FromDatabase = true;
private string fileId = string.Empty;
public string FileId
{
get
{
return this.fileId;
}
set
{
this.fileId = value;
this.ShowPicture();
}
}
private string folderId = string.Empty;
public string FolderID
{
get
{
return this.folderId;
}
set
{
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)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
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;
}
}
}
}
/// <summary>
/// 显示图片
/// </summary>
public void ShowPicture()
{
if (!String.IsNullOrEmpty(this.FileId))
{
// 显示图片
this.ShowPicture(this.FileId);
}
else
{
// 清除图片
this.ClearPicture();
}
}
/// <summary>
/// 显示图片
/// </summary>
/// <param name="id">主键</param>
private void ShowPicture(string id)
{
if (!this.FromDatabase)
{
this.pic.ImageLocation = BaseSystemInfo.StartupPath + id;
}
else
{
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();
}
/// <summary>
/// 从数据库中读取文件
/// </summary>
/// <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;
}
}
else
{
// 复制文件到指定的目录里
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() 设置按钮状态
/// <summary>
/// 设置按钮状态
/// </summary>
private void SetControlState()
{
this.btnSelect.Enabled = true;
// 是从数据库里面读取出来的
if (!String.IsNullOrEmpty(this.FileId) && (String.IsNullOrEmpty(this.pic.ImageLocation) || !this.FromDatabase))
{
this.btnDelete.Enabled = true;
}
else
{
this.btnDelete.Enabled = false;
}
// 清除按钮
this.btnClear.Enabled = false;
if (!String.IsNullOrEmpty(this.pic.ImageLocation))
{
if (this.FromDatabase)
{
this.btnClear.Enabled = true;
this.btnDelete.Enabled = false;
}
else
{
if (!this.pic.ImageLocation.Equals(BaseSystemInfo.StartupPath + this.FileId))
{
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();
}
}
/// <summary>
/// 清除图片
/// </summary>
private void ClearPicture()
{
this.pic.ImageLocation = string.Empty;
this.pic.Image = null;
}
private void btnClear_Click(object sender, EventArgs e)
{
this.ClearPicture();
this.ShowPicture();
// 设置按钮状态
this.SetControlState();
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="id">主键</param>
/// <returns>影响的行数</returns>
public int DeleteFile(string id)
{
int returnValue = 0;
if (this.FromDatabase)
{
// 从数据库服务器删除文件
returnValue = ServiceManager.Instance.FileService.Delete(UserInfo, id);
}
else
{
// 清除图片
this.ClearPicture();
// 删除文件
System.IO.File.Delete(BaseSystemInfo.StartupPath + this.FileId);
}
return returnValue;
}
private void btnDelete_Click(object sender, EventArgs e)
{
if (MessageBox.Show(AppMessage.MSG0207, AppMessage.MSG0000, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
this.SetControlState(false);
this.DeleteFile(this.FileId);
this.FileId = string.Empty;
this.ShowPicture();
// 设置按钮状态
this.SetControlState();
}
}
}
}
// 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;
}
}
/// <summary>
/// 保存到数据库
/// </summary>
public bool FromDatabase = true;
private string fileId = string.Empty;
public string FileId
{
get
{
return this.fileId;
}
set
{
this.fileId = value;
this.ShowPicture();
}
}
private string folderId = string.Empty;
public string FolderID
{
get
{
return this.folderId;
}
set
{
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)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
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;
}
}
}
}
/// <summary>
/// 显示图片
/// </summary>
public void ShowPicture()
{
if (!String.IsNullOrEmpty(this.FileId))
{
// 显示图片
this.ShowPicture(this.FileId);
}
else
{
// 清除图片
this.ClearPicture();
}
}
/// <summary>
/// 显示图片
/// </summary>
/// <param name="id">主键</param>
private void ShowPicture(string id)
{
if (!this.FromDatabase)
{
this.pic.ImageLocation = BaseSystemInfo.StartupPath + id;
}
else
{
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();
}
/// <summary>
/// 从数据库中读取文件
/// </summary>
/// <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;
}
}
else
{
// 复制文件到指定的目录里
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() 设置按钮状态
/// <summary>
/// 设置按钮状态
/// </summary>
private void SetControlState()
{
this.btnSelect.Enabled = true;
// 是从数据库里面读取出来的
if (!String.IsNullOrEmpty(this.FileId) && (String.IsNullOrEmpty(this.pic.ImageLocation) || !this.FromDatabase))
{
this.btnDelete.Enabled = true;
}
else
{
this.btnDelete.Enabled = false;
}
// 清除按钮
this.btnClear.Enabled = false;
if (!String.IsNullOrEmpty(this.pic.ImageLocation))
{
if (this.FromDatabase)
{
this.btnClear.Enabled = true;
this.btnDelete.Enabled = false;
}
else
{
if (!this.pic.ImageLocation.Equals(BaseSystemInfo.StartupPath + this.FileId))
{
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();
}
}
/// <summary>
/// 清除图片
/// </summary>
private void ClearPicture()
{
this.pic.ImageLocation = string.Empty;
this.pic.Image = null;
}
private void btnClear_Click(object sender, EventArgs e)
{
this.ClearPicture();
this.ShowPicture();
// 设置按钮状态
this.SetControlState();
}
/// <summary>
/// 删除文件
/// </summary>
/// <param name="id">主键</param>
/// <returns>影响的行数</returns>
public int DeleteFile(string id)
{
int returnValue = 0;
if (this.FromDatabase)
{
// 从数据库服务器删除文件
returnValue = ServiceManager.Instance.FileService.Delete(UserInfo, id);
}
else
{
// 清除图片
this.ClearPicture();
// 删除文件
System.IO.File.Delete(BaseSystemInfo.StartupPath + this.FileId);
}
return returnValue;
}
private void btnDelete_Click(object sender, EventArgs e)
{
if (MessageBox.Show(AppMessage.MSG0207, AppMessage.MSG0000, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
this.SetControlState(false);
this.DeleteFile(this.FileId);
this.FileId = string.Empty;
this.ShowPicture();
// 设置按钮状态
this.SetControlState();
}
}
}
}
将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。