Winform ListView 嵌入组合框、布尔、图片等复杂控件

一、Winform ListView 显示复杂控件示例

  • 以下展示了两种实现思路方案。
  • 最后修改日期 2024-05 surfsky

1.1 方案一:ListView 结合组合框进行模拟编辑

基本思路

  • 在界面上放置一个lisview和一个combobox,combobox平时是隐藏的。
  • 点击listview,在点击位置的单元格上显示这个combobox
  • combobbox数据变更后,更新到listview

核心代码如:

    public partial class Form1 : Form
    {
        ListViewSubItem _cell;  // 被选中的单元格

        public Form1()
        {
            InitializeComponent();
            InitData();
        }

        void InitData()
        {
            // combobox 
            comboBox1.Visible = false;
            this.comboBox1.Items.Add("科比");
            this.comboBox1.Items.Add("姚明");
            this.comboBox1.Items.Add("杜兰特");
            this.comboBox1.Items.Add("邓肯");

            // listview
            listView1.Columns.Add("第一列");
            listView1.Columns.Add("第二列");
            listView1.Columns.Add("第三列");

            var item = new ListViewItem(1.ToString());
            item.SubItems.Add("姚明");
            item.SubItems.Add("科比");
            listView1.Items.Add(item);

            item = new ListViewItem(2.ToString());
            item.SubItems.Add("邓肯");
            item.SubItems.Add("杜兰特");
            listView1.Items.Add(item);
        }

        // ListView 点击后在点击单位格位置处显示控件
        private void lv_MouseUp(object sender, MouseEventArgs e)
        {
            // 将控件定位到点击单元格中
            var lvi = this.listView1.GetItemAt(e.X, e.Y);
            if (lvi != null)
            {
                _cell = lvi.GetSubItemAt(e.X, e.Y);
                var n = lvi.SubItems.IndexOf(_cell);
                if (_cell != null && n>0)
                {
                    var rect = _cell.Bounds;
                    rect.Y += 5;
                    this.comboBox1.Visible = true;
                    this.comboBox1.Bounds = rect;
                    this.comboBox1.Text = _cell.Text;
                    this.comboBox1.BringToFront();
                    //this.comboBox1.Focus();
                    return;
                }
            }
            this.comboBox1.Visible = false;
        }

        // 组合框数据变更后,将数据更新到单元格
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_cell != null)
            {
                _cell.Text = comboBox1.Text;
            }
        }
    }

效果如:
在这里插入图片描述

1.2 方案二:自定义 ListView 和各种列

功能

  • 嵌入下拉框列
  • 嵌入色彩列
  • 嵌入数字编辑列
  • 嵌入布尔值列
  • 嵌入图片列
  • 点击标题列排序
  • 行选择

使用代码

    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            InitListView();
        }

        public void InitListView()
        {
            this.lv.Columns.Add(new BaseColumnHeader("序号", 50));
            this.lv.Columns.Add(new BaseColumnHeader("可见", 50));
            this.lv.Columns.Add(new BaseColumnHeader("颜色", 60));
            this.lv.Columns.Add(new BaseColumnHeader("数值", 150));
            this.lv.Columns.Add(new BoolColumnHeader("布尔值", Resources.BulletTick, Resources.BulletCross, 100));
            this.lv.Columns.Add(new BaseColumnHeader("图片", 200));

            var r = new Random();
            for (int i = 0; i < 10; i++)
            {
                lv.BeginUpdate();
                var b = r.Next(100) % 2 == 0 ? true : false;
                var item = new ListViewItemBase(i.ToString());
                var visibleCell = new ListViewControlSubItem();
                var colorCell = new ListViewControlSubItem();
                var numCell = new ListViewControlSubItem();
                var boolCell = new ListViewBoolSubItem(b);
                var imageCell = new ListViewImageSubItem(Resources.Cart);

                // combox
                var cmbVisible = new ComboBox();
                cmbVisible.Items.Add("是");
                cmbVisible.Items.Add("否");
                cmbVisible.SelectedIndex = 0;
                //cmbVisible.Focus();

                // color label
                var label = new Label();
                label.BackColor = Color.Green;
                label.Text = "";
                label.BorderStyle = BorderStyle.FixedSingle;
                label.MouseClick += new MouseEventHandler(bt_MouseClick);
                
                // number box
                var num = new NumericUpDown();
                num.Margin = new Padding(0);
                num.Minimum = new decimal(-999999999.0);
                num.Maximum = new decimal(999999999.0);
                num.Value = new decimal(i * 10);
                num.DecimalPlaces = 2;

                // controls
                lv.AddControlToSubItem(visibleCell, cmbVisible);
                lv.AddControlToSubItem(colorCell, label);
                lv.AddControlToSubItem(numCell, num);
                item.SubItems.Add(visibleCell);
                item.SubItems.Add(colorCell);
                item.SubItems.Add(numCell);
                item.SubItems.Add(boolCell);
                item.SubItems.Add(imageCell);
                lv.Items.Add(item);
                lv.EndUpdate();
            }           
        }

        // color box
        void bt_MouseClick(object sender, MouseEventArgs e)
        {
            Label lb = (Label)sender;
            colorDialog1.Color = lb.BackColor;
            if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                lb.BackColor = colorDialog1.Color;
            }
        }


        // get selected item values
        private void button1_Click(object sender, EventArgs e)
        {
            if (lv.SelectedIndices.Count == 0)
            {
                MessageBox.Show("没有选择");
                return;
            }

            for (int j = 0; j < lv.SelectedIndices.Count; j++)
            {
                // item
                int i = lv.SelectedIndices[j];
                var itemName = lv.Items[i] as ListViewItemBase;
                var itemVisible = itemName.SubItems[1] as ListViewControlSubItem;
                var itemColor   = itemName.SubItems[2] as ListViewControlSubItem;
                var itemValue   = itemName.SubItems[3] as ListViewControlSubItem;

                // controls
                ComboBox cmbVisible = itemVisible.Control as ComboBox;
                Label lb = itemColor.Control as Label;
                var num = itemValue.Control as NumericUpDown;

                // values
                string name = itemName.Text;
                Color color = lb.BackColor;
                string visible = cmbVisible.Text;
                double value = Convert.ToDouble((num).Value);
                MessageBox.Show(string.Format("{0},{1},{2},{3}", name, color.ToString(), visible, value));
            }
        }

        private void lv_SelectedIndexChanged(object sender, EventArgs e)
        {
            var ids = lv.SelectedIndices;
        }
    }

效果如:
在这里插入图片描述

二、代码下载

CSDN下载地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机械设计手册第一册:公差

形位公差的标注&#xff1a; 形位公差框格中&#xff0c;不仅要表达形位公差的特征项目、基准代号和其他符号&#xff0c;还要正确给出公差带的大小、形状等内容。 1.形位公差框格&#xff1a; 形位公差框格由两个框格或多个格框组成&#xff0c;框格中的主要内容从左到右按…

mysql中基于规则的优化

大家好。我们在平时开发的过程中可能会写一些执行起来十分耗费性能的语句。当MySQL遇到这种sql时会依据一些规则&#xff0c;竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式&#xff0c;这个过程被称作查询重写&#xff0c;今天我们就来聊一下mysql在查询重写时…

FreeRTOS基础(八):FreeRTOS 时间管理

前面我们用了FreeRTOS中的延时函数&#xff0c;本篇博客就来探讨FreeRTOS中的延时函数&#xff0c;看看他们是如何发挥作用的。当我们在裸机开发中调用delay_ms()函数时&#xff0c;我们的处理器将不处理任何事&#xff0c;造成处理器资源的浪费。 为此&#xff0c;为了提高CPU…

ChatTTS改良版 - 高度逼真的人类情感文本生成语音工具(TTS)本地一键整合包下

先介绍下ChatTTS 和之前发布的 Fish Speech 类似&#xff0c;都是免费开源的文本生成语音的AI软件&#xff0c;但不同的是&#xff0c;ChatTTS测试下来&#xff0c;对于人类情感语调的模仿&#xff0c;应该是目前开源项目做的最好的&#xff0c;是一款高度接近人类情感、音色、…

计算机工作原理(程序猿必备的计算机常识)

目录 一、计算机工作原理1.冯诺依曼体系2. CPU执行指令的过程 二、操作系统三、进程的概念四、进程的管理五、进程的调度 一、计算机工作原理 1.冯诺依曼体系 现在的计算机大多都遵循冯诺依曼体系结构 CPU&#xff1a; 中央处理器&#xff0c;进行算术运算和逻辑判断&#…

百度文心一言API批量多线程写文章软件-key免费无限写

百度文心大模型的两款主力模型ENIRE Speed、ENIRE Lite全面免费&#xff0c;即刻生效。 百度文心大模型的两款主力模型 这意味着&#xff0c;大模型已进入免费时代&#xff01; 据了解&#xff0c;这两款大模型发布于今年 3 月&#xff0c;支持 8K 和 128k 上下文长度。 ER…

赢销侠的秘密武器:如何提升客户满意度?

在竞争激烈的商业战场上&#xff0c;客户满意度是企业能否长盛不衰的关键。它如同一面镜子&#xff0c;映照出企业的服务质量和产品实力。那么&#xff0c;赢销侠们是如何运用秘密武器来提升客户满意度的呢&#xff1f;本文将深入探讨这一课题&#xff0c;并揭示背后的策略与智…

灾备方案中虚拟化平台元数据备份技术应用

首先需要介绍下元数据是什么&#xff1f; 元数据&#xff08;Metadata&#xff09;是一个重要的概念&#xff0c;它描述了数据的数据&#xff0c;也就是说&#xff0c;元数据提供了关于数据属性的信息。这些属性可能包括数据的存储位置、历史数据、资源查找、文件记录等。 元…

LabVIEW与欧陆温控表通讯的实现与应用:厂商软件与自主开发的优缺点

本文探讨了LabVIEW与欧陆温控表通讯的具体实现方法&#xff0c;并对比了使用厂商提供的软件与自行开发LabVIEW程序的优缺点。通过综合分析&#xff0c;帮助用户在实际应用中选择最适合的方案&#xff0c;实现高效、灵活的温控系统。 LabVIEW与欧陆温控表通讯的实现与应用&#…

基于Jenkins+Kubernetes+GitLab+Harbor构建CICD平台

1. 实验环境 1.1 k8s环境 1&#xff09;Kubernetes 集群版本是 1.20.6 2&#xff09;k8s控制节点&#xff1a; IP&#xff1a;192.168.140.130 主机名&#xff1a;k8s-master 配置&#xff1a;4C6G 3&#xff09;k8s工作节点 节点1&#xff1a; IP&#xff1a;192.1…

day-37 最大正方形

思路 动态规划&#xff0c;这题主要得弄明白状态转换方程&#xff0c;dp[i][j]表示以&#xff08;i,j&#xff09;为右下角的最大正方形 解题方法 1.首先将第一行和第一列初始化&#xff0c;当对应位置的matrix为’0’时&#xff0c;dp数组对应位置也为零&#xff0c;否则为1 …

上位机图像处理和嵌入式模块部署(f407 mcu中fatfs中间件使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们已经实现了spi norflash的驱动&#xff0c;理论上这已经可以实现数据的持久化保存了。为什么还需要一个文件系统呢&#xff1f;主要原因还…

HTML静态网页成品作业(HTML+CSS)——家乡常德介绍网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 对话框 | 模态对话框 文章编号&#xff1a;Qt 学习笔记 / 51…

API开发秘籍:揭秘Swagger与Spring REST Docs的文档自动化神技

在这个数字化时代&#xff0c;如何让你的业务像外卖一样快速送达顾客手中&#xff1f;本文将带你走进Spring Boot的世界&#xff0c;学习如何利用RESTful API构建一个高效、直观的“外卖帝国”。从基础的REST架构风格&#xff0c;到Spring MVC的魔力&#xff0c;再到Swagger和S…

解决kettle界面右上角的connect消失——且使用admin登录不上Kettle资源库

一、问题描述 1.1、Kettle界面右上角的connect消失了 当我们配置Kettle界面的资源库(Other Repositories)内容后,Kettle界面右上角的connect消失了;如下图所示: 1.2、使用默认的账户【admin】和密码【admin】登录不上kettle资源库 当我们切换到我们配置的数据库使用超管账…

排序-希尔排序

介绍 希尔排序属于那种没有了解过的直接看代码一脸懵逼的&#xff0c; 所以同学们尽量不要直接看代码&#xff0c;仔细阅读本篇博客内容。 插入排序本来算是一个低效排序&#xff0c; 一次只可以挪动一个数据&#xff0c; 但是&#xff0c;它的强来了&#xff01;&#xff01…

513.找树左下角的值

给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 示例 1: 示例 2: 思路&#xff1a; 深度最大的叶子结点一定是最后一行。 优先左边搜索&#xff0c;记录深度最大的叶子节点&#xff0c;此时就是树的最后一行最左边的值 代码&#xff1a; class Solution:def fi…

272 基于matlab的形态滤波和局域值分解(LMD)的齿轮故障诊断

基于matlab的形态滤波和局域值分解&#xff08;LMD&#xff09;的齿轮故障诊断&#xff0c;GUI交互界面。通过形态滤波对一维信号进行降噪处理&#xff0c;并通过LMD局部均值分解提取故障信号&#xff0c;最后提取处故障频率。程序已调通&#xff0c;可直接运行。 272 形态滤波…

红外听力教学考试系统-红外语音听力广播在大学英语四六级听力考试中应用

红外听力教学考试系统-红外语音听力广播在大学英语四六级听力考试中的应用 由北京海特伟业科技有限公司任洪卓发布于2024年6月1日 红外语音听力广播&#xff08;即红外听力教学考试系统&#xff09;在英语四六级听力考试的应用正日益凸显出其重要性和优越性。在当前的高等教育…