第四章:使用ListView控件展示数据
第四章:使用ListView控件展示数据
本章目标
- 会使用ImageList控件存放图片
- 会使用ListView控件展示数据
- 会使用ContextMenuStrip实现快捷操作
本章内容
ListView :列表视图控件
什么是ListView控件:以特定样式或视图类型显示列表项
在Windows系统中显示硬盘则使用此控件,如下图:
ListView控件的常用属性:
(1)FullRowSelect:设置是否行选择模式。(默认为false) 提示:只有在Details视图该属性才有意义。
(2) GridLines:设置行和列之间是否显示网格线。(默认为false)提示:只有在Details视图该属性才有意义。
(3)AllowColumnReorder:设置是否可拖动列标头来对改变列的顺序。(默认为false)提示:只有在Details视图该属性才有意义。
(4)View:获取或设置项在控件中的显示方式,包括Details、LargeIcon、List、SmallIcon、Tile(默认为 LargeIcon),具体解释如下:
1、LargeIcon:每个项都显示为一个最大化图标,在它的下面有一个标签。
2、SmallIcon:每个项都显示为一个小图标,在它的右边带一个标签。
3、List:每个项都显示为一个小图标,在它的右边带一个标签。各项排列在列中,没有列标头。
4、Details:可以显示任意的列,但只有第一列可以包含一个小图标和标签,其它的列项只能显示文字信息,有列表头。
5、Tile:每个项都显示为一个完整大小的图标,在它的右边带项标签和子项信息。(只有Windows XP 和 Windows Server 2003 系列支持)
(5)MultiSelect:设置是否可以选择多个项。(默认为false)
(6)HeaderStyle:获取或设置列标头样式。
Clickable:列标头的作用类似于按钮,单击时可以执行操作(例如排序)。
NonClickable:列标头不响应鼠标单击。
None:不显示列标头。
(7)LabelEdit:设置用户是否可以编辑控件中项的标签,对于Detail视图,只能编辑行第一列的内容。(默认为false)
(8)CheckBoxes:设置控件中各项的旁边是否显示复选框。(默认为false)
(9)LargeImageList:大图标集。提示:只在LargeIcon视图使用。
(10)SmallImageList:小图标集。提示:只有在SmallIcon视图使用。
(11)StateImageList:图像蒙板。这些图像蒙板可用作LargeImageList和SmallImageList图像的覆盖图,这些图像可用于指示项的应用程序定义的状态。(暂时不大懂)
(12)SelectedItems:获取在控件中选定的项。
(13)CheckedItems:获取控件中当前复选框选中的项。
(14)Soritng:对列表视图的项进行排序。(默认为None)
Ascending:项按递增顺序排序。
Descending:项按递减顺序排序。
None:项未排序。
(15)Scrollable:设置当没有足够空间来显示所有项时是否显示滚动条。(默认为true)
(16)HoverSelection:设置当鼠标指针悬停于项上时是否自动选择项。(默认为false)
(17)HotTracking:设置当鼠标指针经过项文本时,其外观是否变为超链接的形式。(默认为false)
(18)HideSelection:设置选定项在控件没焦点时是否仍突出显示。(默认为false)
(19)ShowGroups:设置是否以分组方式显示项。(默认为false);
(20)Groups:设置分组的对象集合。
(21)TopItem:获取或设置控件中的第一个可见项,可用于定位。(效果类似于EnsureVisible方法)
使用ListView实现大小图标切换:
需要用到的属性:
属性名称 说 明 Items ListView中的项 View 指定显示哪种视图 LargeImageList 大图标图像的ImageList控件 SmallImageList 小图标图像的ImageList控件
ImageList控件
作用:
ImageList控件用来存放使用的图像对象集合
常用属性:
属性名称 说 明 Images 存储的所有图像 ImageSize 图像的大小 ColorDepth 颜色数 TransparentColor 被视为透明的颜色 注意事项:
先设置ColorDepth、ImageSize属性值再添加图片,反之不能更改这两个属性值
ListView实现大小图标切换
具体步骤:
搭建窗体,具体实现如下 :
具体说明:
- 在窗体中拖入ListView控件,按上图实现布局
- 拖入二个控件ImageList,分别导入大图标到ilBig,小图标到ilSmall中
- 在ListView控件中引入LargeImageList中添加ilBig,SmallImageList中添加ilSmall
- 在ListView中添加项(Items)
具体说明:
- 选择ListView中的编辑项目,或属性中找到Items,打开ListViewItem集合编辑器
- 添加项成员,设置Text属性,则为显示的文本,设置ImageIndex为显示图片的索引
通过设置ListView的属性View,可查看大小图片效果。
添加按钮,实现动态切换大小图标效果,如下图:
- 添加事件,实现动态切换View,代码如下:
1
2
3
4
5
6
7
8
9private void btnBig_Click(object sender, EventArgs e)
{
lvList.View = View.LargeIcon;//设置大图标
}
private void btnSmall_Click(object sender, EventArgs e)
{
lvList.View = View.SmallIcon;//设置小图标
}通过右键菜单实现动态View切换:
- 加入右键菜单控件,如下图:
- 在ListView中绑定右键菜单,
- 代码实现,可以将右键菜单的Click事件绑定到上面的按钮事件中,实现同一事件功能
ListView的详细信息视图
了解ListView的详细视图组成:
显示详细视图,用到的属性:
属性名称 说 明 Columns 详细视图中显示的列 Items ListView中的项 具体步骤:
设置窗体相关属性,效果如下:
编辑项,设置各项的列的对应值
添加按钮和右键功能,具体实现同上方式一样,指定View=Details(详细视图)代码省略….
代码实现如上功能
可动态通过代码指定视图模式,以上功能有演示:
具体说明:
View为视图类型,是一个枚举型,可以动态指定模式,如下代码:
1
lvMyComputer.View = View.LargeIcon;
可动态绑定ImageList图标:
1
2
3
4// 设置大图标关联的ImageList
lvMyComputer.LargeImageList = this.ilLarge;
// 设置小图标关联的ImageList
lvMyComputer.SmallImageList = this.ilSmall;实现动态添加项:
具体步骤:
创建ListViewItem对象
1
ListViewItem itemC = new ListViewItem("C盘",0);//指定显示文本和图标索引
向项中添加子项
1
2
3
4
5
6
7
8方式一:
itemC.SubItems.Add("本地磁盘");
itemC.SubItems.Add("14.2GB");
itemC.SubItems.Add("4.54GB");
方式二:
itemC.SubItems.AddRange(
new string[]{"本地磁盘", "14.2GB", "4.54GB"});将项添加到ListView中
1
lvMyComputer.Items.Add(itemC);
完整代码如下 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24private void FrmListView_Load(object sender, EventArgs e)
{
lvList.View = View.Details;
lvList.SmallImageList = ilSmall;
lvList.LargeImageList = ilBig;
//创建ListViewItem,参数为显示文本和图标索引
ListViewItem itemC = new ListViewItem("C盘", 0);
//方式一:添加子项
itemC.SubItems.Add("本地磁盘");
itemC.SubItems.Add("200G");
itemC.SubItems.Add("100G");
//方式二:添加子项
ListViewItem itemD = new ListViewItem("D盘", 1);
itemD.SubItems.AddRange(
new string[] {"本地磁盘","100G","30G" }
);
//将子项添加到ListView控件
lvList.Items.Add(itemC);
lvList.Items.Add(itemD);
}
使用ListView展示数据
具体效果,如下图所示:
具体实现:
加载时实现查询所有学生信息
点击查询按钮实现根据学生姓名查询
具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46private void FrmStudentList_Load(object sender, EventArgs e)
{
GetStudentList();
}
public void GetStudentList()
{
string connString = "server=.;database=MySchool;uid=sa;pwd=sa;";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
string sql = "SELECT [StudentNo] ,[StudentName],[Sex],g.GradeName FROM [Student] s JOIN Grade g on s.GradeId=g.GradeId where 1=1 ";
if (txtStudentName.Text.Trim() != "")
{
sql += " and StudentName like '%" + txtStudentName.Text.Trim() + "%'";
}
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
ListViewItem item = new ListViewItem(dr["StudentNo"].ToString());
item.Tag = dr["StudentNo"];//将学号保存在Tag标签中
item.SubItems.AddRange(
new string[]
{
dr["StudentName"].ToString(),
dr["Sex"].ToString(),
dr["GradeName"].ToString()
}
);
lvStuList.Items.Add(item);
}
dr.Close();
}
}
private void btnSearch_Click(object sender, EventArgs e)
{
lvStuList.Items.Clear();//点击后必须先清空ListView的项
GetStudentList();
}添加右键功能,实现如下效果:
具体实现步骤:
添加右键菜单,将ListView的右键进行关联。
实现获取选中学生的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15private void tsmiSelectStudent_Click(object sender, EventArgs e)
{
if (lvStuList.SelectedItems.Count == 0)
{
MessageBox.Show("请选择至少一条学生信息!");
return;
}
string studentNo = lvStuList.SelectedItems[0].SubItems[0].Text;
string studentName = lvStuList.SelectedItems[0].SubItems[1].Text;
string sex = lvStuList.SelectedItems[0].SubItems[2].Text;
string gradeName = lvStuList.SelectedItems[0].SubItems[3].Text;
string info = string.Format("学生学号:{0},姓名:{1},姓名:{2},年级:{3}", studentNo, studentName, sex, gradeName);
MessageBox.Show(info);
}
课后作业
1.用ListView模拟显示计算机信息,包含:名称、类型、总大小、可用空间,备注。
所有数据用代码动态填充。
2.用ListView显示图书信息,包含:图书编号,图书名称、作者、图书类别。
数据库:MyBook
数据表:Books(ISBN,Name,Author,Type)
数据:
GCKJ20240101,使用Stratch开发桌面小游戏,高旭辉, 游戏开发
GCKJ20240102,使用HTML/CSS开发静态网站,陈凯, 软件开发
GCKJ20240103,使用jQuery开发网页小游戏,陈凯, 游戏开发
GCKJ20240104,使用winForm开发桌面应用程序,陈凯, 软件开发
GCKJ20240105,使用python开发网络爬虫应用程序,高旭辉, 软件开发
要求:分组显示数据(1.按类别,2.按作者)