程序开发 > C# > Winform > 正文

C# ListView控件显示表格(自适应宽度),添加 Checkbox,删除选择项,选中颜色和鼠标滑过背景变色

亮术网 2020-03-07 本网原创

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所示:

listView显示表格

图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所示:

listView表格自适应宽度

图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所示:

添加复选框(Winform listview checkbox)

图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所示:

Winform listview 选中颜色和字体修改以突出显示

图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所示:

C# Winform ListView 鼠标滑过背景变色

图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 测试,可直接复到文件运行看效果。

本文浓缩标签:ListView表格C#