C# Winform控件-------ListView列表视图

本文详细描述了如何在Windows应用程序中实现文件列表的展示,包括创建基础参数类、自定义排序类(继承IComparer接口),以及使用ListView控件展示文件夹和文件,支持不同视图模式(详情、列表、大图标、小图标)的切换和排序功能。
摘要由CSDN通过智能技术生成

简单实现文件列表 (文件图标,文件排序,视图显示)

目录

 一、创建基础参数类

二、创建排序类,继承IComparer接口,实现对象比较方法

三、放置ListView控件、contextMenuStrip菜单控件 

四、实现代码 

五、效果 

六、Resources资源(添加现有文件)


 

 一、创建基础参数类


    class MyListItemTag
    {
        public int type = 0; //类型:文件夹0, 文件1 
        public string path;
        public string name;
        public DateTime time;
        public long size = -1;
        public string ext; // 显示文件后缀/文件夹

        public MyListItemTag(int type, string path, string name, DateTime time, long size, string ext)
        {
            this.type = type;
            this.path = path;
            this.name = name;
            this.time = time;
            this.size = size;
            this.ext = ext;
        }
    }

二、创建排序类,继承IComparer接口,实现对象比较方法

 


    public class MyListItemSorter : IComparer
    {

        public bool asc = true;//是否升序排序

        public MyListItemSorter(bool asc)
        {
            this.asc = asc;
        }

        public int Compare(object x, object y)
        {
            //按列排序时,传入的是两个ListViewItem对象
            ListViewItem item1 = (ListViewItem)x;
            ListViewItem item2 = (ListViewItem)y;

            // Tag: 每一项关联的数据
            MyListItemTag tag1 = (MyListItemTag)item1.Tag;
            MyListItemTag tag2 = (MyListItemTag)item2.Tag;

            // 目录在前, 文件在后
            if (tag1.type != tag2.type)
                return CompareInt(true, tag1.type, tag2.type);

            // 按名字比较
            return CompareStringIgnoreCase(asc, tag1.name, tag2.name);
        }

        // 两个 Bool 值的比较
        public int CompareBool(bool asc, bool x, bool y)
        {
            int xx = x ? 1 : 0;
            int yy = y ? 1 : 0;
            return CompareInt(asc, xx, yy);
        }

        // 两个 Int 值的比较
        public int CompareInt(bool asc, int x, int y)
        {
            if (asc)
                return x - y;
            else
                return y - x;
        }

        // 两个String值的比较
        public int CompareString(bool asc, string x, string y)
        {
            if (asc)
                return x.CompareTo(y);
            else
                return y.CompareTo(x);
        }

        // 两个String值的比较 (不区分大小写)
        public int CompareStringIgnoreCase(bool asc, string x, string y)
        {
            return CompareString(asc, x.ToLower(), y.ToLower());
        }
    }

三、放置ListView控件、contextMenuStrip菜单控件 

 

四、实现代码 

 


        public ListView()
        {
            InitializeComponent();
            InitializeListView();//显示listview
            //加载添加文件数据项
            LoadDir(new DirectoryInfo("D:\\"));

        }

        private void InitializeListView()
        {
            //1.设置显示模式为详情模式:显示图标+主项+所有子项
            listView1.View = View.Details;
            // 设置整行选中(选中某一项的时候选中整行,而不只是主项)
            listView1.FullRowSelect = true;
            //2.设置列名Add(列名,宽度[像素值],对齐方式)
            // 宽度值-2表示自动调整宽度
            listView1.Columns.Add("文件名", -2, HorizontalAlignment.Left);
            listView1.Columns.Add("修改时期", 150, HorizontalAlignment.Left);
            listView1.Columns.Add("类型", 100, HorizontalAlignment.Left);
            listView1.Columns.Add("大小", -2, HorizontalAlignment.Left);
            //创建ImageList(提供一些方法,来管理一些列图片资源的列表类),并添加2个小图标
            ImageList imgList = new ImageList();
            imgList.ImageSize = new Size(16, 16);//设置列表中图片的大小
            imgList.Images.Add("Icon_folder", Properties.Resources.Icon_folder);//事先添加到Resources的图标
            imgList.Images.Add("Icon_file", Properties.Resources.Icon_file);
            // 设置 SmallImageList 用于显示小图标(适用于小图标、详情、列表模式显示图标)
            // 设置 LargeImageList 用于显示大图标(适用于大图标模式显示图标)
            listView1.SmallImageList = imgList;

            // 点击列标题时,指示排序的图标
            // 把图标资源加到 SmallImageList 里,供列标题头部显示
            imgList.Images.Add("Sort_ASC", Properties.Resources.up);
            imgList.Images.Add("Sort_DESC", Properties.Resources.down);
            //ListView首列图标显示为 key=""Sort_ASC"
            listView1.Columns[0].ImageKey = "Sort_ASC";

            //*创建LargeImageList 大图标列表(用于LargeIcon模式里显示大图标)
            ImageList largeImgList = new ImageList();
            largeImgList.ImageSize = new Size(64, 64);//设置列表中图片的大小
            largeImgList.Images.Add(Properties.Resources.Icon_folder);
            largeImgList.Images.Add(Properties.Resources.Icon_file);
            listView1.LargeImageList = largeImgList;


        }
        //2.遍历本地资源,获取文件或目录
        private void LoadDir(DirectoryInfo dir)
        {
            // 加载优化:BeginUpdate()+EndUpdate(),该方法指明内部的程序全部执行完后才进行一次总更新,而不是每Add一项就更新一次。(避免频繁刷新)
            // listView1.BeginUpdate();

            // 获取[子目录]列表
            DirectoryInfo[] subDirs = dir.GetDirectories();
            foreach (DirectoryInfo d in subDirs)
            {
                //如果该目录是隐藏文件,则跳过
                if ((d.Attributes & FileAttributes.Hidden) > 0) continue;
                //3.1否则就添加到ListVie中显示(目录名称,最新修改时间,数据项类型,文件大小)
               // AddListItem(d.Name, d.LastWriteTime, "文件夹", -1);
                //3.2将数据打包为Tag对象进行添加
                MyListItemTag tag = new MyListItemTag(0, d.FullName, d.Name, d.LastWriteTime, -1, "文件夹");
                AddListItemsort(tag);
            }
            // 获取[子文件]列表
            FileInfo[] subFiles = dir.GetFiles();
            foreach (FileInfo f in subFiles)
            {
                //如果该文件是隐藏文件,则跳过
                if ((f.Attributes & FileAttributes.Hidden) > 0) continue;
                string ext = f.Extension.ToUpper(); // 获取文件拓展名后缀(.zip、.png、.doc等)
                //3.1否则就添加到ListVie中显示(文件名称,最新修改时间,文件后缀类型,文件大小)
               // AddListItem(f.Name, f.LastWriteTime, ext, f.Length);
                //3.2将数据打包为Tag对象进行添加
                MyListItemTag tag = new MyListItemTag(1, f.FullName, f.Name, f.LastWriteTime, f.Length, f.Extension.ToUpper());
                AddListItemsort(tag);
            }

            // listView1.EndUpdate();
        }

//3.2将文件和目录按照不同类型添加到ListView数据项
        private void AddListItemsort(MyListItemTag tag)
        {
            // 判断是文件还是文件夹,使用不同的图标
            int imageIndex = 0;
            if (!tag.ext.Equals("文件夹")) imageIndex = 1;
            ListViewItem item = new ListViewItem(tag.name, imageIndex);
            // **Item关联Tag数据对象(方便我们从Item中获取数据、进行排序等)
            item.Tag = tag;
            // 事件子项
            item.SubItems.Add(tag.time.ToString("yyyy-MM-dd HH:mm"));
            // 后缀名称子项
            item.SubItems.Add(tag.ext);
            // 大小子项
            long size = tag.size;
            string sizeStr = "";
            if (size < 0)
                sizeStr = ""; // 文件夹不显示大小
            else if (size < 1000)
                sizeStr = "" + size;
            else if (size < 1000000)
                sizeStr = size / 1000 + " KB";
            else if (size < 1000000000)
                sizeStr = size / 1000000 + " MB";
            else
                sizeStr = size / 1000000000 + " GB";

            item.SubItems.Add(sizeStr);
            listView1.Items.Add(item);
        }

        //4.ListView添加MouseUp点击事件:显示右键菜单(菜单中默认选中当前的显示模式)
        private void listView1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                View view = listView1.View;
                //根据显示模式,设置右键菜单的选中项
                
                menuDetail_Item.Checked = (view == View.Details);
                menuList_Item.Checked = (view == View.List);
                menuLarge_Item.Checked = (view == View.LargeIcon);
                menuSmall_Item.Checked = (view == View.SmallIcon);
                //显示右键菜单(在鼠标右键位置e.Location)
                contextMenuStrip1.Show(listView1, e.Location);
            }

        }

        private bool asc = true;
        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            if (e.Column == 0)//如果点击的是第0列,才触发事件
            {
                //切换当前排序
                this.asc = !asc;
                if (asc)
                {
                    //设置排序器
                    listView1.ListViewItemSorter = new MyListItemSorter(true);
                    listView1.Sort();//排序
                    listView1.Columns[0].ImageKey = "Sort_ASC";//切换图标
                }
                else
                {
                    listView1.ListViewItemSorter = new MyListItemSorter(false);
                    listView1.Sort();
                    listView1.Columns[0].ImageKey = "Sort_DESC";
                }
            }
        }
        //5.设置右键菜单的点击事件:切换显示模式
        private void menuDetail_Item_Click(object sender, EventArgs e)
        {
            listView1.View = View.Details;
        }

        private void menuList_Item_Click(object sender, EventArgs e)
        {
            listView1.View = View.List;
        }

        private void menuLarge_Item_Click(object sender, EventArgs e)
        {
            listView1.View = View.LargeIcon;
        }

        private void menuSmall_Item_Click(object sender, EventArgs e)
        {
            listView1.View = View.SmallIcon;
        }
 

五、效果 

详情视图

列表视图

 

大图标视图

 

小图标视图

 

六、Resources资源(添加现有文件)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值