通用權限管理系統元件源碼裡,有職員管理的功能,實作了直接可以把照片拖拽過來的功能,用起來會很友善。
管理軟體能支援拖拽功能,會好用很多,使用者體驗也會改善很多。想做好一個元件需要把放放面面都徹底做好才可以。
想要控件支援拖拽,需要設定 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