C# ListView控件显示表格(自适应宽度),添加 Checkbox,删除选择项,选中颜色和鼠标滑过背景变色
DataGridView控件功能十分强大,显示表格也方便,但性能就没有那么高;ListView控件功能没那么强大,显示表格也要多写代码,但性能相对高一些。开发过程中,可根据需要选用;对于显示表格来说,用 ListView控件也不难,以下是两个具体实例。
一、C# Winform ListView 生成表格
1、拉一个 ListView控件到 Form1 窗口中,双击 Form1 窗口打开后台代码文件。
2、显示表格代码(固定列宽度):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ShowTable
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ShowTableWithListview();
}
private void ShowTableWithListview()
{
listView1.GridLines = true;//表格是否显示网格线
listView1.FullRowSelect = true;//是否选中整行
listView1.View = View.Details;//设置显示方式
listView1.Scrollable = true;//是否自动显示滚动条
listView1.MultiSelect = false;//是否可以选择多行
//添加表头(列)
listView1.Columns.Add("产品名称", 160, HorizontalAlignment.Center);
listView1.Columns.Add("产品型号", 100, HorizontalAlignment.Center);
listView1.Columns.Add("价格", 100, HorizontalAlignment.Center);
listView1.Columns.Add("数量", 100, HorizontalAlignment.Center);
//添加表格内容
for (int i = 0; i < 6; i++)
{
ListViewItem item = new ListViewItem();
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());
listView1.Items.Add(item);
}
}
}
}
显示表格效果如图1所示:
图1
3、自适应列宽度代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ShowTable
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ShowTableAdaptiveWidthColumn ();
}
private void ShowTableAdaptiveWidthColumn()
{
listView1.GridLines = true;//表格是否显示网格线
listView1.FullRowSelect = true;//是否选中整行
listView1.View = View.Details;//设置显示方式
listView1.Scrollable = true;//是否自动显示滚动条
listView1.MultiSelect = false;//是否可以选择多行
//添加表头(列)
listView1.Columns.Add("ProductName", "产品名称");
listView1.Columns.Add("SN", "产品型号");
listView1.Columns.Add("Price", "价格");
listView1.Columns.Add("Number", "数量");
//添加表格内容
for (int i = 0; i < 3; i++)
{
ListViewItem item = new ListViewItem();
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());
listView1.Items.Add(item);
}
listView1.Columns["ProductName"].Width = -1;//根据内容设置宽度
listView1.Columns["SN"].Width = -2;//根据标题设置宽度
listView1.Columns["Price"].Width = -2;
listView1.Columns["Number"].Width = -2;
}
}
}
效果图如图2所示:
图2
二、C# Winform ListView 表格功能扩展
1、添加复选框(Winform listview checkbox)
需要 ListView 的 CheckBoxes 和 MultiSelect 属性设置为 True。再拖一个 CheckBox 控件到 ListView 下面,打开“属性”窗口(右键 CheckBox,然后选择“属性”),把它的 Text 属性改为“全选”;选择“事件”选项卡,在 CheckedChanged 右边添加 CbAll_CheckedChanged,按回车,添加选择改变事件。
方法一:
private void SelectAllCheckBoxes(ListView lv, bool currVal)
{
for (int i = 0; i < lv.Items.Count; i++)
lv.Items[i].Checked = currVal;
}
方法二:
private void SelectAllCheckBoxes(ListView lv, bool currVal)
{
foreach (ListViewItem item in lv.Items)
item.Checked = currVal;
}
调用:
private void CbAll_CheckedChanged(object sender, EventArgs e)
{
SelectAllCheckBoxes(listView1, cbAll.Checked);
}
效果图如图3所示:
图3
2、Winform listview 删除选择项
拖一个 Label 控件到 ListView 下面“全选”右边;打开“属性”窗口(右键 listView1,选择“属性”),选择“事件”选项卡,在 MouseClick 右边添加 lblDel_MouseClick 事件,再添加如下代码:
private void lblDel_MouseClick(object sender, MouseEventArgs e)
{
foreach (ListViewItem item in listView1.Items)
{
if (item.Checked)
item.Remove();
}
}
3、Winform listview 选中颜色和字体修改以突出显示
打开“属性”窗口(右键 listView1,选择“属性”),选择“事件”选项卡,在 CheckedChanged 右边添加 listView1_ItemSelectionChanged 事件,再添加如下代码:
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
listView1.FullRowSelect = true;
if (this.listView1.SelectedItems.Count > 0)
{
//清除原有前景颜色
foreach (ListViewItem lvi in listView1.Items)
lvi.ForeColor = Color.Black;
//清除原有背景颜色和字体
foreach (ListViewItem lvi in listView1.Items)
{
lvi.BackColor = Color.White;
Font font = new Font(Control.DefaultFont, FontStyle.Regular);
lvi.Font = font;
}
listView1.SelectedItems[0].SubItems[0].ForeColor = Color.OrangeRed;
Font newFont = new Font(Control.DefaultFont, FontStyle.Bold); //加粗选中行字体
listView1.SelectedItems[0].SubItems[0].Font = newFont;
listView1.SelectedItems[0].BackColor = Color.FromArgb(5, 206, 249, 221);//设置选中行背景颜色
listView1.SelectedItems[0].Selected = false;
}
}
效果图如图4所示:
图4
4、ListView 鼠标滑过背景变色
(1)响应快的方法
打开“属性”窗口(右键 listView1,选择“属性”),选择“事件”选项卡,在 MouseMove 右边添加 listView1_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;
}
}
效果图如图5所示:
图5
(2)响应慢的方法
同样在 ItemMouseHover 右边添加 listView1_ItemMouseHover 事件,再添加如下代码:
ListViewItem lastSelectedItem = null;
private void listView1_ItemMouseHover(object sender, ListViewItemMouseHoverEventArgs e)
{
if (lastSelectedItem != null)
lastSelectedItem.BackColor = Color.White;
e.Item.BackColor = Color.LightGreen;
lastSelectedItem = e.Item;
}
5、ListView 行高设置
设置方法请看《C# listview行高设置完整实例》一文,里面有详细介绍。
以上代码通过 Visual Studio 2019 测试,可直接复到文件运行看效果。