Winform ListView 控件使用详解

一、Winform ListView 控件

Winform ListView 适合展示一些只读的数据,性能很好。它有以下功能:

二、什么时候使用它?

  • 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

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土豆湿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值