简单实现文件列表 (文件图标,文件排序,视图显示)
目录
二、创建排序类,继承IComparer接口,实现对象比较方法
三、放置ListView控件、contextMenuStrip菜单控件
一、创建基础参数类
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资源(添加现有文件)