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;
            }
        }

        
///   <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();
            }
        }    
    }
}

 

 

 本文转自jirigala_bao 51CTO博客,原文链接:http://blog.51cto.com/jirigala/809334

相关文章
|
3月前
|
存储 安全 Java
程序与技术分享:C#值类型和引用类型的区别
程序与技术分享:C#值类型和引用类型的区别
28 0
|
23小时前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
|
8天前
|
C#
C# 一分钟浅谈:循环结构 for 和 while 的应用
【9月更文挑战第1天】循环结构是编程中的基础概念,C# 中常用的 `for` 和 `while` 循环允许重复执行代码直至满足特定条件。`for` 循环基于计数,适用于已知循环次数的情况;`while` 循环基于条件,适用于未知循环次数的情况;`do-while` 循环则至少执行一次循环体。本文详细介绍了这些循环的语法和示例,并探讨了常见问题及其解决方法,如循环条件和更新表达式的错误设置。通过综合应用示例(如计算阶乘和斐波那契数列),帮助读者更好地理解和掌握循环结构的使用方法。正确使用循环可以提高程序的效率和可读性。
22 2
|
24天前
|
开发框架 .NET 编译器
总结一下 C# 如何自定义特性 Attribute 并进行应用
总结一下 C# 如何自定义特性 Attribute 并进行应用
|
8天前
|
开发者 C# Android开发
Xamarin 与 .NET:解锁现代化移动应用开发的超级武器——深入探讨C#与.NET框架如何赋能跨平台应用,实现高效编码与卓越性能
【8月更文挑战第31天】Xamarin 与 .NET 的结合为开发者提供了强大的平台,用于构建现代化移动应用。通过 C# 和 .NET 框架,Xamarin 可以实现一次编写、多平台运行,覆盖 iOS、Android 和 Windows。这种方式不仅节省了开发时间和成本,还保证了应用的一致性和高质量。Xamarin 是一个开源框架,专为跨平台移动应用开发设计,允许使用 C# 语言和 .NET 核心库构建原生应用,并访问各平台特定功能。微软维护的 Xamarin 是 Visual Studio 生态系统的一部分,极大地提高了开发效率。
29 0
|
8天前
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
16 0
|
8天前
|
开发者 C# C++
揭秘:如何轻松驾驭Uno Platform,用C#和XAML打造跨平台神器——一步步打造你的高性能WebAssembly应用!
【8月更文挑战第31天】Uno Platform 是一个跨平台应用程序框架,支持使用 C# 和 XAML 创建多平台应用,包括 Web。通过编译为 WebAssembly,Uno Platform 可实现在 Web 上运行高性能、接近原生体验的应用。本文介绍如何构建高效的 WebAssembly 应用:首先确保安装最新版本的 Visual Studio 或 VS Code 并配置 Uno Platform 开发环境;接着创建新的 Uno Platform 项目;然后通过安装工具链并使用 Uno WebAssembly CLI 编译应用;最后添加示例代码并测试应用。
21 0
|
2月前
|
存储 Oracle 关系型数据库
PACS源码,C#语言数字医学影像系统成品源码
**数字医学影像系统(RIS/PACS)**采用C#开发,基于C/S架构,配Oracle数据库,具备自主版权,适用于项目实施。系统包含分诊、超声、放射、内镜、病理等工作站,支持基本信息维护、报表查询和系统维护。功能亮点有:WorkList管理、影像采集传输、存储检索、图像处理、多序列浏览、流程控制、报告录入与审核、支持多种影像设备及高级影像处理。RIS与PACS数据库同步,并集成HIS、电子病历等系统接口。全面遵循DICOM3.0标准。
PACS源码,C#语言数字医学影像系统成品源码
|
15天前
|
缓存 NoSQL Redis
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间