抓紧收藏:winform编程精品干货内容-制作图片转Pdf文件-01实现图片拖拽到列表中(含源码)

本文主要介绍了,如何实现从文件夹中直接拖拽图片到列表控件(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凯杨1319

您的打赏是我持续创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值