C# WinForm —— 27 28 29 30 ListView 介绍与应用

1. 简介

和ListBox的外观类似,都可以多列显示,但 ListView 功能更强大,提供了5种不同的显示方式

2. 属性

属性 解释
(Name) 控件ID,在代码里引用的时候会用到
Enabled 控件是否启用
CheckBoxes 复选框是否显示在项旁边
ContextMenuStrip 当用户右键该控件时显示的快捷菜单
Dock 定义要绑定到容器的控件边框
Items ListView中的项的集合
Alignment ListView中各项的对齐方式:Default、Left、Top(默认)、SnapToGrid
View 显示项的5种不同视图: LargeIcon:大图标,添加项的时候,默认是多列显示的 SmallIcon:小图标 Details:详细信息 List:列表 Tile:
Columns "详细信息" 视图中显示的列
AllowColumnReorder 是否允许用户重新排列 "详细信息"视图中各列的顺序
FullRowSelect 当项被选中时,其所有子项是否同该项一起突出显示
GridLines 在项和子项周围显示网格线。仅在"详细信息"视图中显示
HeaderStyle "详细信息"视图中列标头的样式:Clickable、NonClickable、None
AutoArrange 在 大图标 和小图标 视图中,项是否自动进行排列,默认true
LargeImageList 大图标、Tile视图中,用于显示的大图标图像集合(ImageList)
SmallImageList 除大图标、Tile视图外所有视图中,用于显示的图标图像集合(ImageList)
Groups ListView中的组,集合
LabelEdit 是否允许用户就地编辑项标签
labelWrap 确定标签文本是否可以换到新行
MultiSelect 是否允许选择多项
Scrollable 如果控件包含的项过多,超出工作区的范围时,该控件是否显示滚动条
ShowGroups 指示控件是否以组的形式显示项
ShowItemToolTips 允许ListViewItems显示工具提示
Sorting 对项进行排序的方式:None、Ascending、Descending
StateImageList ListView为自定义状态所使用的ImageList控件
CheckedIndices 所有勾选了复选框的项的索引集合
CheckedItems 所有勾选了复选框的项的集合
SelectedIndices 所有选中的项的索引集合
SelectedIndex 所选中的单个项的索引
SelectedItems 所有选定的项

3. 方法

方法 解释
BeginUpdate()和 EndUpdate() 在大量通过Items方法加载项的时候,在加载项的语句前后分别加上 BeginUpdate() 和 EndUpdate() 语句,可以避免控件出现闪烁
Clear() 清空项
EnsureVisible 确保指定项在控件中是可见的,必要时滚动控件内容
FindItemWithText 找到第一个指定文本开头的项
FindNearestItem 按照指定的搜索方向,从指定点开始查找下一个项

4. 事件

事件 解释
SelectedIndexChanged 每当此ListView的 "SelectedIndex"属性更改时发生
ColumnClick 在单击列标头时发生
AfterLabelEdit 在用户已编辑项文本时发生
BeforeLabelEdit 在用户将要编辑项文本时发生
ItemCheck 指示某项的选中状态将要更改,直到事件发生后,该值才会更新
ItemChecked 当ListView项的Checked属性更改时引发的事件
ItemSelectionChanged 当某项的选定状态更改时引发的事件

5. 列的集合的操作

操作 方法
访问列 从集合中获取具有指定键值 / 索引值的列标题
添加列 Add方法,可以指定键名,列名,宽度,对齐方式,图标索引
列的数量 Count方法
设置列只读 IsReadOnly方法
添加单列 Add(ColumnHeader value)
添加多列 AddRange(ColumnHeader[] values)
清空所有列 Clear()
判断列是否存在 Contains(ColumnHeader value) ContainsKey(string key)
获取列的索引 IndexOf(ColumnHeader value) IndexOfKey(string key)
插入列 Insert
移除列 Remove(ColumnHeader column) RemoveAt(int index) RemoveByKey(string key)

6. 项的集合的操作

操作 方法
访问项 从集合中获取具有指定键值 / 索引值的项
设置项只读 IsReadOnly
项的数量 Count
添加项 Add方法,可以指定键名,文本,图标索引/图标键值
添加项的集合 AddRange方法
清除项 Clear方法
判断项是否存在 Contains(ListViewItem item) ContainsKey(string key)
复制项 CopyTo(Array dest, int index)
查找项 Find(string key, bool searchAllSubItems)
获取项的索引 IndexOf(ListViewItem item) IndexOfKey(string key)
插入项 Insert,可以设置输入项的索引、键值、文本、图像索引/图像键值
移除项 Remove(ListViewItem item) RemoveAt(int index) RemoveByKey(string key)

7. 组的集合的操作

操作 方法
访问组 通过指定键值 / 索引值访问
组的数量 Count
添加组 Add, AddRange
清除组 Clear
判断组是否存在 Contains(ListViewGroup value)
复制组 CopyTo(Array array, int index)
获取组的索引 IndexOf(ListViewGroup value)
插入组 Insert
移除组 Remove(ListViewGroup group) RemoveAt(int index)

8. 不同的视图

  1. 拖控件

  2. 加载图像到 ImageList 组件
csharp 复制代码
private void FrmListView2_Load(object sender, EventArgs e)
{
	// 加载 Form 的时候,默认显示 大图标
	LoadImgList(); //加载图片
	lvList.Items.Clear();
	lvList.ShowGroups = false; // 不分组显示
	if (largeList != null && largeList.Images.Count > 0)
	{
		for (int i=0; i<lareList.Images.Count; i++) // 对于 lareList 中的每张图
		{
			string iText = largeList.Images.Keys[i];  // 图的名字
			// 添加ListView控件中的项
			ListViewItem li = new ListViewItem();
			li.Text = iText;
			li.ImageIndex = i;
			LvList.Items.Add(li);
		}
	}
	lvList.View = View.LargeIcon; // 指定 大图标显示
	lvList.largeImageList = largeList; // 大图标、Tile视图 使用的ImageList
	lvList.SmallImageList = smallList; // 除大图标、Tile视图以外,所有视图使用的ImageList
}

Dictionary<int, string> dic = new Dictionary<int, string>;

private void LoadImgList() // 加载图片集合
{
	string path = @"D:\课件\录制课件\WF\WFFormUse\WFFormUse\Imgs";
	if (Directory.Exists(path))
	{
		string[] files = Directory.GetFiles(path);
		if (files.Length > 0)
		{
			largeList.Images.Clear();
			smallList.Images.Clear();
			int index = 0;
			string[] fileType = {".jpg", ".png"};
			foreach (string fpath in files)
			{
				if (fileType.Contains(Path.GetExtension(fpath)))
				{
					Image img = Image.FromFile(fpath);
					string key = Path.GetFileNameWithoutExtension(fpath);
					largeList.Images.Add(key, img);
					smallList.Images.Add(key, img);
					dic.Add(index, fpath);
					index++;
				}
			}
			// 指定图片尺寸
			largeList.ImageSize = new Size(50, 50);
			smallList.ImageSize = new Size(20, 20);
		}
	}
}
  1. 运行

    大图标的样式:最大化图标,下面显示文本标签

  2. 点击 "大图标"按钮,以大图标的样式显示

  1. 点击 "小图标"按钮,以小图标的样式显示

小图标的样式:小图标,右边显示文本标签

  1. 点击 "List"按钮,以列表的样式显示:小图标,右边显示文本标签,各项排列在列中,没有列标头
  1. 点击 "Tile"按钮,以 Tile 的样式显示:大图标, 关联的是largeList,右边显示文本标签,如果还有其他SubItems信息,也显示在右边

  2. "详细信息"视图:分列显示,第一列显示小图标,右边显示文本,其他列只显示文本,有列标头
csharp 复制代码
private void btnDetails_Click(object sender, EventArgs e)
{
	lvList.Items.Clear();
	lvList.Column.Clear();
	lvList.ShowGroups = false;
	lvList.View = View.Details; 
	// 列的添加
	lvList.Columns.Add("文件名", 100, HorizontalAlignment.Left); // 设置列名,列宽,对齐方式
	lvList.Columns.Add("修改日期", 150, HorizontalAlignment.Left);
	lvList.Columns.Add("类型", 80, HorizontalAlignment.Left);
	lvList.Columns.Add("大小", 60, HorizontalAlignment.Left);
	// 项
	for (int i = 0; i < dic.Count; i++)
	{
		ListViewItem li = new ListViewItem();
		li.ImageIndex = i;
		li.Text = smallList.Images.Keys[i]; // 文件名
		li.SubItems.Add(File.getCreationTime(dic[i]).ToString()); // 修改日期
		li.SubItems.Add(Path.getExtension(dic[i])); // 类型
		long length = new FileInfo(dic[i]).Length; // 获取文件大小,以字节为单位
		li.SubItems.Add((length/1024).ToString()); // 文件大小, kb为单位
		lvList.Items.Add(li);
	}
	lvList.GridLines = true; // 显示网格
}

再点击"Tile"按钮时:

  1. 分组功能
csharp 复制代码
private void btnGroup_Click(object sender, EventArgs e)
{
	lvList.ShowGroups = true;
	//添加组
	lvList.Groups.Clear();
	lvList.Groups.Add(new ListViewGroup("花", HorizontalAlignment.Center));
	lvList.Groups.Add(new ListViewGroup("动物", HorizontalAlignment.Center));
	lvList.Groups.Add(new ListViewGroup("人物", HorizontalAlignment.Center));
	lvList.Groups.Add(new ListViewGroup("风景", HorizontalAlignment.Center));
	// 组名--图片名称中包含了分组信息
	Dictionary<string, string> dicGroup = new Dictionary<string, string>();
	dicGroup.Add("花", "04");
	dicGroup.Add("动物", "01");
	dicGroup.Add("人物", "02");
	dicGroup.Add("风景", "03");
	// 分组
	for (int i = 0; i < lvList.Items.Count; i++)
	{
		foreach(ListViewGroup lvg in lvList.Groups)
		{
			// 判断项文本的前两个字符是否与组所对应的编号一致,如果一致,就将该项分到这一组
			if (lvList.Items[i].Text.Substring(0,2) == dicGroup[lvg.Header])
			{
				lvList.Items[i].Group = lvg; // 设置项所属的组
				break;
			}
		}
	}
}

运行,点击 "分组显示" 按钮,大图标视图:

小图标视图:

List视图 不支持分组显示

先点 "分组显示" ,再点 "详细信息",因为点击 "详细信息"的时候,清空了ListView控件中的信息后重新添加项和列的,所以没有分组信息:

先点 "详细信息",再点 "分组显示":

Tile视图:

参考:2023年C#之WinForm零基础教程50讲

相关推荐
新手unity自用笔记1 小时前
项目-坦克大战学习-子弹的移动与销毁
笔记·学习·c#
qinzechen2 小时前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#
yufei-coder6 小时前
C# Windows 窗体开发基础
vscode·microsoft·c#·visual studio
dangoxiba6 小时前
[Unity Demo]从零开始制作空洞骑士Hollow Knight第十三集:制作小骑士的接触地刺复活机制以及完善地图的可交互对象
游戏·unity·visualstudio·c#·游戏引擎
AitTech6 小时前
深入理解C#中的TimeSpan结构体:创建、访问、计算与格式化
开发语言·数据库·c#
hiyo58510 小时前
C#中虚函数和抽象函数的概念
开发语言·c#
开心工作室_kaic12 小时前
基于微信小程序的校园失物招领系统的设计与实现(论文+源码)_kaic
c语言·javascript·数据库·vue.js·c#·旅游·actionscript
时光追逐者16 小时前
WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!
前端·microsoft·开源·c#·.net·layui·.netcore
friklogff17 小时前
【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具
开发语言·c#·.net
hiyo5851 天前
C#的面向对象
开发语言·c#