一、Winform ListView 控件
Winform ListView 适合展示一些只读的数据,性能很好。它有以下功能:
- 可显示列表数据,数据包含一个大图标、小图标、文本、多个扩展文本。
- 可多选、可分组。
- 可以展示为 List, Detail, Tile(类似Card), SmallIcon, LargeIcon 几种视图模式。
- 支持虚拟数据模式。
二、什么时候使用它?
- ListView 适合做一些数据的只读展示,感觉就是给资源管理器定制的目录文件展示控件。
- 和 Web 版的 Repeater 控件不一样,它不能添加自定义的控件进去,项也是固定格式的不能自定义行控件。
- 如果要显示为表格、要交互、修改数据等操作,建议直接试用 DataGridView 控件。
- 如果要展示自定义的卡片视图,建议直接用 FlowLayout + 自定义控件的方式。
三、显示数据
在Form上放置一个listview,并写一下代码初始化以及填充数据。
private void InitListView()
{
lv.GridLines = true; // 表格是否显示网格线
lv.FullRowSelect = true; // 是否选中整行
lv.View = View.Details; // 设置显示方式
lv.Scrollable = true; // 是否自动显示滚动条
lv.MultiSelect = false; // 是否可以选择多行
lv.CheckBoxes = true; // 显示复选框
lv.LargeImageList = this.imageListLarge; // 图形列表
lv.SmallImageList = this.imageListSmall; // 小图形列表
// group
ListViewGroup group1 = new ListViewGroup("Group1");
ListViewGroup group2 = new ListViewGroup("Group2");
lv.Groups.Add(group1);
lv.Groups.Add(group2);
lv.ShowGroups = true;
}
private void ShowListView()
{
//添加表头(列)
lv.Columns.Clear();
lv.Columns.Add("产品名称", 160, HorizontalAlignment.Center);
lv.Columns.Add("产品型号", 100, HorizontalAlignment.Center);
lv.Columns.Add("价格", 100, HorizontalAlignment.Center);
lv.Columns.Add("数量", 100, HorizontalAlignment.Center);
//添加表格内容
lv.Items.Clear();
for (int i = 0; i < 6; i++)
{
var item = new ListViewItem();
item.ImageIndex = i;
item.Group = i < 3 ? lv.Groups[0] : lv.Groups[1];
item.SubItems.Clear();
item.SubItems[0].Text = "产品" + i.ToString();
item.SubItems.Add(i.ToString());
item.SubItems.Add((i + 7).ToString());
item.SubItems.Add((i * i).ToString());
lv.Items.Add(item);
}
}
四、切换视图
工具栏上放置一个下拉菜单按钮ddbView,用以下代码显示视图切换菜单:
/// <summary>显示视图列表</summary>
void ShowViewTypes()
{
this.ddbView.DropDownItems.Add(View.Details.ToString(), Resources.ViewDetail, (o, e) => { this.lv.View = View.Details; });
this.ddbView.DropDownItems.Add(View.List.ToString(), Resources.ViewList, (o, e) => { this.lv.View = View.List; });
this.ddbView.DropDownItems.Add(View.Tile.ToString(), Resources.ViewTile, (o, e) => { this.lv.CheckBoxes = false; this.lv.View = View.Tile; });
this.ddbView.DropDownItems.Add(View.LargeIcon.ToString(), Resources.ViewLargeIcon, (o, e) => { this.lv.View = View.LargeIcon; });
this.ddbView.DropDownItems.Add(View.SmallIcon.ToString(), Resources.ViewSmallIcon, (o, e) => { this.lv.View = View.SmallIcon; });
}
五、勾选行选及分组控制
这个简单,直接给代码。注意有些视图下checkbox不能显示会报异常。故以下代码中用了异常捕捉。
//------------------------------------------------------
// 行勾选、行选择、显示分组控制
//------------------------------------------------------
// 全部勾选
private void chkCheckAll_CheckedChanged(object sender, EventArgs e)
{
try
{
this.lv.CheckBoxes = true;
foreach (ListViewItem item in this.lv.Items)
{
item.Checked = chkCheckAll.Checked;
}
}
catch { }
}
// 全部行选中
private void chkSelectAll_CheckedChanged(object sender, EventArgs e)
{
try
{
lv.MultiSelect = true;
foreach (ListViewItem item in this.lv.Items)
{
item.Selected = chkSelectAll.Checked;
}
}
catch { }
}
// 是否显示分组
private void chkGroup_CheckedChanged(object sender, EventArgs e)
{
this.lv.ShowGroups = this.chkGroup.Checked;
}
六、鼠标行变色
给listview控件设置MouseMove 事件,并写以下代码:
private void listView1_MouseMove(object sender, MouseEventArgs e)
{
ListView lv = (ListView)sender;
ListViewItem oldItem = null;
if (lv.Tag != null)
oldItem = (ListViewItem)lv.Tag;
ListViewItem curItem = lv.GetItemAt(e.X, e.Y);//获取鼠标所在的项
if (curItem != null)
{
// 还原鼠标上次所在项的背景颜色
if (oldItem != null && oldItem != curItem)
oldItem.BackColor = lv.BackColor;
curItem.BackColor = Color.LightGreen;//设置当前项的背景颜色
lv.Tag = curItem;
}
else
{
if (oldItem != null && oldItem.BackColor != lv.BackColor)
oldItem.BackColor = lv.BackColor;
}
}
七、效果及代码下载
转载请注明出处 SURFSKY