本文主要介绍了,如何实现从文件夹中直接拖拽图片到列表控件(listview)中,还是老规矩话不多说先看效果
效果也看了,我们来学习如何实现吧,下面是实现代码
第一步就不用介绍了,先创建一个项目,然后照着对着下面的图把界面先做出来
第二步就是写代码了,我这里就不耽误时间了,直接贴出代码,里面有很详细的步骤
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace ImageToPdf
{
public partial class MainForm : Form
{
/*创建委托用于控件的异步更新
* 这里创建了三个委托:声明未委托关键字就是delegate
* 语法就是 修饰词 delegate 返回类型 自定义委托名(类型 自定义名称);
* 例如:public delegate void GetImagesDelegate(string imageFiles);
* 第一个(AddImageDelegate)用于更新拖拽图片后将图片添加到图片列表控件(ImageList)中。
* 第二个(AddListViewItemDelegate)用于更新列表控件ListView中的数据
* 第三个(ShowImageCountDelegate)用于更新Lable标签控件显示内容
* 这样写的好处是软件运行和使用时不影响用户操作,如果不用的话也行
* 但是数据量大的情况下软件会出现假死情况。
*/
public delegate void AddImageDelegate(Image image);
public delegate void AddListViewItemDelegate(ListViewItem item);
public delegate void ShowImageCountDelegate(int count);
public MainForm()
{
InitializeComponent();
CreateColumnsTitle();
}
/// <summary>
/// 这个方法用于把用户拖到软件中的图片逐个
/// 从文件对应的路径下读取出来并调用AddImage方法
/// 把图片添加到控件ImageList中
/// </summary>
/// <param name="imageFiles"></param>
private void GetImage(String[] imageFiles)
{
try
{
foreach(string imageFile in imageFiles)
{
/*使用文件流把图片从对应的路径下读取出来
*因为用来文件流的操作,所有要在使用完以后释放掉占用的内存
*使用using会自动在使用后释放掉。
*/
using (FileStream file = new FileStream(imageFile, FileMode.Open))
{
//把读取到的图片放在Image对象中
Image img = Image.FromStream(file);
//把Image对象中的图片到ImageList控件中
AddImage(img);
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 把图片添加到ImageList控件中
/// </summary>
/// <param name="image"></param>
private void AddImage(Image image)
{
//这里是判断控件是不是在同一个线程中创建的,如果是就执行if里的代码
//如果不是可以直接操作控件完成添加
if (this.InvokeRequired)
{
//这里就用到了我们声明的委托,委托在使用请须先创建对象
AddImageDelegate addImage = new AddImageDelegate(AddImage);
//这里Invoke是跨线程控件操作,委托addImage对象把信息更新到控件上
this.Invoke(addImage, new object[] {image });
}
else
{
IconimageList.Images.Add(image);
IconimageList.ImageSize = new Size(60, 80);
ShowImageCount(IconimageList.Images.Count);
}
}
/// <summary>
/// 给listview控件添加对应的列表数据
/// </summary>
/// <param name="item"></param>
private void AddListViewItem(ListViewItem item)
{
//这里是判断控件是不是在同一个线程中创建的,如果是就执行if里的代码
//如果不是可以直接操作控件完成添加
if (this.InvokeRequired)
{
AddListViewItemDelegate addImage = new AddListViewItemDelegate(AddListViewItem);
this.Invoke(addImage, new object[] { item });
}
else
{
ImageslistView.Items.Add(item);
//把列表控件的小图标和大图标用的图片都使用同一个ImageLsit控件(图片列表控件)
ImageslistView.SmallImageList = IconimageList;
ImageslistView.LargeImageList = IconimageList;
}
}
/// <summary>
/// 创建列表中的列
/// </summary>
private void CreateColumnsTitle()
{
this.ImageslistView.Columns.Add("名称", 200, HorizontalAlignment.Left);
this.ImageslistView.Columns.Add("类型", 40, HorizontalAlignment.Center);
this.ImageslistView.Columns.Add("大小", 80, HorizontalAlignment.Center);
this.ImageslistView.Columns.Add("尺寸", 90, HorizontalAlignment.Center);
this.ImageslistView.Columns.Add("位置",300,HorizontalAlignment.Left);
ImageslistView.HeaderStyle = ColumnHeaderStyle.Nonclickable;//把点击标题设置成无效
ImageslistView.GridLines = true;
ImageslistView.AllowDrop = true;
}
#region 用于显示文件个数
private void ShowImageCount(int count)
{
if (this.InvokeRequired)
{
ShowImageCountDelegate showImageCount = new ShowImageCountDelegate(ShowImageCount);
this.Invoke(showImageCount, new object[] { count });
}
else
{
this.imageCountLable.Text = count + "张";
}
}
#endregion
private void ImageslistView_DragEnter(object sender, DragEventArgs e)
{
//设置拖放操作中目标放置类型为复制
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
/// <summary>
/// 拖拽图片到ListView控件中时会触发该事件
/// DragDrop这个是ListView控件自带的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ImageslistView_DragDrop(object sender, DragEventArgs e)
{
try
{
String[] imageFiles = e.Data.GetData(DataFormats.FileDrop, false) as String[];
ListFolder(imageFiles);
}
catch (Exception e1)
{
MessageBox.Show(e1.Message, " Error ",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// List files in the folder
/// </summary>
/// <param name="directory"> the directory of the folder </param>
private void ListFolder(String[] fileList)
{
GetImage(fileList);
for (int i = 0; i < fileList.Length; i++)
{
//显示文件名
string filename = Path.GetFileName(fileList[i]);
ListViewItem itemName = new ListViewItem(filename);
itemName.Tag = fileList[i];
itemName.ImageIndex = GetImageIndex(fileList.Length,i);
//显示图片类型
ListViewItem.ListViewSubItem subItem = new ListViewItem.ListViewSubItem();
subItem.Text = Path.GetExtension(filename).Replace(".","").ToUpper();
itemName.SubItems.Add(subItem);
//显示文件大小
subItem = new ListViewItem.ListViewSubItem();
long size;
string strSize;
strSize= GetImageSize(fileList[i], out size);
subItem.Text = strSize;
subItem.Tag = size;
itemName.SubItems.Add(subItem);
//显示文件尺寸
subItem = new ListViewItem.ListViewSubItem();
using (Stream stream = File.OpenRead(fileList[i]))
{
using (Image sourceImage = Image.FromStream(stream, false, false))
{
subItem.Text = sourceImage.Width+"*"+ sourceImage.Height;
}
}
itemName.SubItems.Add(subItem);
//显示文件原式路径
subItem = new ListViewItem.ListViewSubItem();
subItem.Text = fileList[i];
itemName.SubItems.Add(subItem);
AddListViewItem(itemName);
}
}
/// <summary>
/// 计算添加文件后用于显示缩了图的索引号
/// 确保每张图片的图和信息对应上
/// </summary>
/// <param name="imageCount"></param>
/// <param name="number"></param>
/// <returns></returns>
private int GetImageIndex(int imageCount,int number)
{
int count = IconimageList.Images.Count;
//根据已经添加的图片数量计算出图片的索引
int index = (count - imageCount)+ number;
return count > 1 ? index : 0;
}
/// <summary>
/// 获取图片的大小
/// </summary>
/// <param name="filePath"></param>
/// <param name="size"></param>
/// <returns></returns>
private string GetImageSize(string filePath, out long size)
{
FileInfo fileInfo = new FileInfo(filePath);
size = fileInfo.Length;
string strSize;
if (size < 1024)
{
strSize = size.ToString();
}
else if (size < 1024 * 1024)
{
strSize = string.Format(" {0:###.##}KB ", (float)size / 1024);
}
else if (size < 1024 * 1024 * 1024)
{
strSize = string.Format(" {0:###.##}MB ", (float)size / (1024 * 1024));
}
else
{
strSize = string.Format(" {0:###.##}GB ", (float)size / (1024 * 1024 * 1024));
}
return strSize;
}
}
}
好了以上就是完整的代码了,源代码已经同步发布,点击下载listview拖拽实现.rar