列表控件
列表控件 ListView相当于 ListBox的增强版,支持多列显示
最典型的例子:Windows的文件管理器的列表显示
列表控件的几种视图:
Detail:详情模式
List: 列表模式
LargeIcon:大图标模式
Smallcon:小图标模式
列表控件的几个特点:
显示模式可以切换
可以多字段显示
可以设置图标
标签可以编辑
每列可以单独排序
自定义绘制的技术,在WinForm高级篇讲解
示例:
添加一个ListView
设置Dock 为Fill 填满整个空间
设置显示模式
设置列标题
添加数据项
运行结果
添加数据
演示:用ListView将 C:\盘下的文件夹、文件列出.
对照代码讲解。。
项目演示
图标设置:
listView1.LargelmageList 用于大图标模式
listView1.SmalllmageList 用于其他显示模式
在添加一项时,指定所使用的图片的索引
item = new ListViewItem(label, imageIndex)
创建LoadDir 遍历目录下文件夹
详情见 阿发你好 winform 教程
显示性能优化:
在批量添加数据时,为了避免界面频繁更新
listView1.BeginUpdate();
修改显示数据
listView1.EndUpdate();
切换显示模式
演示:添加右键菜单,实现4种显示模式的切换。。
–设置大图标列表
–添加右键菜单
------添加4个菜单项
------添加菜单项的点击处理
–添加右键处理
------点击右键时,弹出菜单
右键鼠标事件
要点与细节
1显示菜单时,要根据当前的显示模式,设置各菜单项的选中状态
列的排序
1 添加图标资源
Ico_Up
lco_Down
两个箭头图标,表示升序(ASC)和 降序(DESC)
2 将图标加入 SmalllmageList
imageList.lmages,Add("Sort ASC",Properties.Resources.lco Up);
imageList.lmages.Add("Sort DESC",Properties.Resources.lco Down);
listView1.Columns[0].lmageKey ="Sort ASC"
其中,
Images.Add(key, image)表示添加一个图像 image,并关联一个 key 值。后面可以根据 key 值获取此图片。
3 添加 Columnclick 事件处理
当点击列标题时,触发此事件
private void listView1_ColumnCliqk(object sender, ColumnClickEventArgs e)
{
if(e.Column == 0)
{
}
}
本例中,只支持第一列的排序动作,所以这里要检查一个列号 e.Column 是不是第一列。
4 排序
排序时,要指定比较器 ListViewltemSorter,然后调用 Sort()方法开始排序
l
istView1.ListViewltemSorter = new MyListltemSorter(true);
listView1.Sort();
listView1.Columns[0].lmageKey = "Sort_ASC";
5 定义数据项
MyListltemTag定义 MyListltemTag,
每个 ListViewltem 关联一个 Tag对象
ListViewltem item =new ListViewltem(tag.name, imagelndex);
item.Tag = tag;
6 定义比较器 MyListltemSorter
比较器需要实现 IComparer 接口
public class MyListltemSorter : lComparer
public int Compare(object x, object y)
{
ListViewltem item1 = x as ListViewltem;
ListViewltemitem2 = (ListViewltem)y;
}
实现 Compare 方法,比较对象x和y的相对大小。其中,传进来的 x y 对象实际上是 ListViewltem 类型。
要点与细节
1每个ListViewItem可以关联一个Tag对象在WinForm里,Tag一般用于关联一个数据对象
编辑标签
标签 Label:指每一个列表项的显示文本
演示:
列表项的标签可以被直接编辑。。(第一列)
步骤:
1 设置 LabelEdit 为true,允许编辑
2 启动编辑
鼠标先选中、再点击即可启动编辑
也可以调用 ListViewItem.BeginEdit()启动编辑(使用右键菜单,开启)
添加菜单项
添加事件响应
3 编辑验证
有两个事件:
BeforeLabelEdit:编辑前验证
AfterLabelEdit:编辑之后验证
e.Item 表示编辑项的索引
e.Label表示文本框中的值
e.CancelEdit 表示是否取消此次输入
实现不可添加重复数据
要点与细节
1当实现右键菜单方式时,需要记录当前点中的项
private ListViewltem mouseClickltem;
添加一个成员字段,在后续的菜单点击处理中使用
2 ListView控件只适合 Label 的编辑如果想编辑所有字段,应该考虑使用表格控件