第四章:使用ListView控件展示数据

本章目标

  1. 会使用ImageList控件存放图片
  2. 会使用ListView控件展示数据
  3. 会使用ContextMenuStrip实现快捷操作

本章内容

ListView :列表视图控件

  1. 什么是ListView控件:以特定样式或视图类型显示列表项

  2. 在Windows系统中显示硬盘则使用此控件,如下图:

    1714878023477

  3. 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方法)

  4. 使用ListView实现大小图标切换:

    1. 需要用到的属性:

      属性名称 说 明
      Items ListView中的项
      View 指定显示哪种视图
      LargeImageList 大图标图像的ImageList控件
      SmallImageList 小图标图像的ImageList控件
  5. ImageList控件

    1. 作用:

      ImageList控件用来存放使用的图像对象集合

    2. 常用属性:

      属性名称 说 明
      Images 存储的所有图像
      ImageSize 图像的大小
      ColorDepth 颜色数
      TransparentColor 被视为透明的颜色

      注意事项:

      先设置ColorDepth、ImageSize属性值再添加图片,反之不能更改这两个属性值

ListView实现大小图标切换

具体步骤:

  1. 搭建窗体,具体实现如下 :

    1714879427263

    具体说明:

    1. 在窗体中拖入ListView控件,按上图实现布局
    2. 拖入二个控件ImageList,分别导入大图标到ilBig,小图标到ilSmall中
    3. 在ListView控件中引入LargeImageList中添加ilBig,SmallImageList中添加ilSmall
    1. 在ListView中添加项(Items)

    1714879894626

    具体说明:

    1. 选择ListView中的编辑项目,或属性中找到Items,打开ListViewItem集合编辑器
    2. 添加项成员,设置Text属性,则为显示的文本,设置ImageIndex为显示图片的索引
    1. 通过设置ListView的属性View,可查看大小图片效果。

    2. 添加按钮,实现动态切换大小图标效果,如下图:

    1714880217568

    1. 添加事件,实现动态切换View,代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void btnBig_Click(object sender, EventArgs e)
    {
    lvList.View = View.LargeIcon;//设置大图标
    }

    private void btnSmall_Click(object sender, EventArgs e)
    {
    lvList.View = View.SmallIcon;//设置小图标
    }
    1. 通过右键菜单实现动态View切换:

      1. 加入右键菜单控件,如下图:

      1714880428986

      1. 在ListView中绑定右键菜单,

      1714880485409

      1. 代码实现,可以将右键菜单的Click事件绑定到上面的按钮事件中,实现同一事件功能

      1714880563846

ListView的详细信息视图

  1. 了解ListView的详细视图组成:

    1714880912764

  2. 显示详细视图,用到的属性:

    属性名称 说 明
    Columns 详细视图中显示的列
    Items ListView中的项
  3. 具体步骤:

    1. 设置窗体相关属性,效果如下:

      1714881355484

    2. 编辑项,设置各项的列的对应值

      1714881778366

    3. 添加按钮和右键功能,具体实现同上方式一样,指定View=Details(详细视图)代码省略….

代码实现如上功能

  1. 可动态通过代码指定视图模式,以上功能有演示:

    具体说明:

    View为视图类型,是一个枚举型,可以动态指定模式,如下代码:

    1
    lvMyComputer.View = View.LargeIcon;
  2. 可动态绑定ImageList图标:

    1
    2
    3
    4
    // 设置大图标关联的ImageList
    lvMyComputer.LargeImageList = this.ilLarge;
    // 设置小图标关联的ImageList
    lvMyComputer.SmallImageList = this.ilSmall;
  3. 实现动态添加项:

    具体步骤:

    1. 创建ListViewItem对象

      1
      ListViewItem itemC = new ListViewItem("C盘",0);//指定显示文本和图标索引 
    2. 向项中添加子项

      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"});
    3. 将项添加到ListView中

      1
      lvMyComputer.Items.Add(itemC);
    4. 完整代码如下 :

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      private 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. 具体效果,如下图所示:

    1714883923687

  2. 具体实现:

    1. 加载时实现查询所有学生信息

    2. 点击查询按钮实现根据学生姓名查询

    3. 具体代码如下:

      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
      46
      private 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();
      }
    4. 添加右键功能,实现如下效果:

      1714884697001

      具体实现步骤:

      1. 添加右键菜单,将ListView的右键进行关联。

      2. 实现获取选中学生的信息

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        private 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.按作者)