实现类似Excel的筛选

以下是在 DataGridView 中实现类似 Excel 下拉筛选功能的解决方案:

解决思路

  1. DataGridView 的列添加 DataGridViewComboBoxColumn 类型的列,用于显示下拉筛选列表。
  2. DataGridViewColumnHeaderMouseClick 事件添加处理程序,当用户点击列头时,显示下拉筛选菜单。
  3. 根据列的数据生成下拉列表的选项。

实现代码

using System;
using System.Collections.Generic;
using System.Windows.Forms;public partial class Form1 : Form
{public Form1(){InitializeComponent();// 假设你已经将 DataGridView 绑定到数据源,例如通过 FillDataGridView 方法FillDataGridView();}private void FillDataGridView(){// 假设你有一个数据源,这里使用一个简单的 List 作为示例List<TempTaskInfoTable> list = new List<TempTaskInfoTable>();// 添加一些数据到列表中list.Add(new TempTaskInfoTable { sampleName = "Sample 1", priority = "High" });list.Add(new TempTaskInfoTable { sampleName = "Sample 2", priority = "Medium" });list.Add(new TempTaskInfoTable { sampleName = "Sample 3", priority = "Low" });BindingSource dataSource = new BindingSource();dataSource.DataSource = list;dataGridView1.DataSource = dataSource;}private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e){DataGridViewColumn column = dataGridView1.Columns[e.ColumnIndex];if (column is DataGridViewComboBoxColumn){return;}// 生成下拉列表的选项List<string> options = new List<string>();foreach (DataGridViewRow row in dataGridView1.Rows){if (row.Cells[e.ColumnIndex].Value!= null){string value = row.Cells[e.ColumnIndex].Value.ToString();if (!options.Contains(value)){options.Add(value);}}}DataGridViewComboBoxColumn comboBoxColumn = new DataGridViewComboBoxColumn();comboBoxColumn.DataSource = options;comboBoxColumn.HeaderText = column.HeaderText;comboBoxColumn.Name = column.Name;comboBoxColumn.DataPropertyName = column.DataPropertyName;// 替换原来的列int columnIndex = e.ColumnIndex;dataGridView1.Columns.RemoveAt(columnIndex);dataGridView1.Columns.Insert(columnIndex, comboBoxColumn);}
}public class TempTaskInfoTable
{public string sampleName { get; set; }public string priority { get; set; }
}

代码解释

  1. 初始化和数据绑定部分
    • FillDataGridView 方法中,创建一个 List<TempTaskInfoTable> 作为数据源,并添加一些数据。
    • 使用 BindingSource 将数据绑定到 dataGridView1
  2. 列头点击事件处理部分
    • dataGridView1_ColumnHeaderMouseClick 事件处理程序中:
      • 获取用户点击的列。
      • 遍历 dataGridView1 的行,收集该列的所有唯一值,存储在 options 列表中。
      • 创建一个 DataGridViewComboBoxColumn,将 options 作为其数据源。
      • 设置 DataGridViewComboBoxColumnHeaderTextNameDataPropertyName 与原列相同。
      • 移除原列,并将 DataGridViewComboBoxColumn 插入到原列的位置。

使用说明

  1. 在你的 Windows 窗体应用程序中,将上述代码添加到相应的 Form 类中。
  2. 确保你已经在窗体中添加了 dataGridView1 控件。
  3. dataGridView1ColumnHeaderMouseClick 事件关联 dataGridView1_ColumnHeaderMouseClick 方法。
  4. 当用户点击 DataGridView 的列头时,该列将被替换为一个下拉列表,下拉列表的选项是该列的唯一值。

优化建议

  1. 保存原始列的信息,当用户取消筛选时,可以将列恢复为原始状态。
  2. 对于大量数据,可以使用 HashSet<string> 来存储唯一值,提高性能。
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{DataGridViewColumn column = dataGridView1.Columns[e.ColumnIndex];if (column is DataGridViewComboBoxColumn){return;}// 生成下拉列表的选项HashSet<string> options = new HashSet<string>();foreach (DataGridViewRow row in dataGridView1.Rows){if (row.Cells[e.ColumnIndex].Value!= null){string value = row.Cells[e.ColumnIndex].Value.ToString();options.Add(value);}}DataGridViewComboBoxColumn comboBoxColumn = new DataGridViewComboBoxColumn();comboBoxColumn.DataSource = new List<string>(options);comboBoxColumn.HeaderText = column.HeaderText;comboBoxColumn.Name = column.Name;comboBoxColumn.DataPropertyName = column.DataPropertyName;// 替换原来的列int columnIndex = e.ColumnIndex;dataGridView1.Columns.RemoveAt(columnIndex);dataGridView1.Columns.Insert(columnIndex, comboBoxColumn);
}
  1. 可以添加一个按钮或菜单项,用于清除筛选条件,将 DataGridViewComboBoxColumn 恢复为原列。
  2. 对于筛选逻辑,可以添加筛选功能,根据用户选择的下拉选项过滤数据,可使用 DataViewRowFilter 实现。
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{DataGridViewColumn column = dataGridView1.Columns[e.ColumnIndex];if (column is DataGridViewComboBoxColumn){return;}HashSet<string> options = new HashSet<string>();foreach (DataGridViewRow row in dataGridView1.Rows){if (row.Cells[e.ColumnIndex].Value!= null){string value = row.Cells[e.ColumnIndex].Value.ToString();options.Add(value);}}DataGridViewComboBoxColumn comboBoxColumn = new DataGridViewComboBoxColumn();comboBoxColumn.DataSource = new List<string>(options);comboBoxColumn.HeaderText = column.HeaderText;comboBoxColumn.Name = column.Name;comboBoxColumn.DataPropertyName = column.DataPropertyName;comboBoxColumn.ValueMember = column.DataPropertyName;comboBoxColumn.DisplayMember = column.DataPropertyName;comboBoxColumn.SelectedIndexChanged += ComboBoxColumn_SelectedIndexChanged;// 替换原来的列int columnIndex = e.ColumnIndex;dataGridView1.Columns.RemoveAt(columnIndex);dataGridView1.Columns.Insert(columnIndex, comboBoxColumn);
}private void ComboBoxColumn_SelectedIndexChanged(object sender, EventArgs e)
{DataGridViewComboBoxColumn comboBoxColumn = (DataGridViewComboBoxColumn)sender;string selectedValue = comboBoxColumn.SelectedValue.ToString();DataView dataView = (DataView)bindingSource.DataSource;if (string.IsNullOrEmpty(selectedValue)){dataView.RowFilter = "";}else{dataView.RowFilter = $"{comboBoxColumn.DataPropertyName} = '{selectedValue}'";}
}

在上述代码中,为 DataGridViewComboBoxColumnSelectedIndexChanged 事件添加了处理程序,根据用户的选择更新 RowFilter 以实现筛选功能。

注意事项

  1. 当处理用户选择时,需要确保数据类型匹配,避免类型转换异常。
  2. 对于复杂的数据类型,可能需要自定义 ToString 方法或使用其他数据转换方式。
  3. 当处理大量数据时,需要考虑性能问题,例如在生成下拉列表选项时,可以使用异步操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 CentOS 中生成 CSR

在本教程中&#xff0c;我们将向您展示如何在CentOS 7和6中生成CSR。您可以直接从服务器生成 CSR。 只需按照以下步骤操作&#xff1a; 第 1 步&#xff1a;使用安全外壳 &#xff08;SSH&#xff09; 登录您的服务器 步骤 2&#xff1a;创建私钥和 CSR 文件 在提示符处键入以…

️ 如何将 Julia 包切换为本地开发版本?以 Reactant 为例

你是否正在开发一个 Julia 包&#xff0c;并希望将其从官方版本切换为本地开发版本&#xff1f;&#x1f914; 本文将手把手教你如何实现这一操作&#xff0c;并介绍一些实用技巧&#xff0c;让你的开发过程更加高效&#xff01;&#x1f680; &#x1f4cb; 准备工作 在开始之…

STM32-笔记40-BKP(备份寄存器)

一、什么是BKP&#xff08;备份寄存器&#xff09;&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或…

深入了解 alias 命令

1、alias简介 在 Unix 和类 Unix 系统中&#xff0c;alias&#xff08;别名&#xff09;是一个非常实用的命令&#xff0c;它允许用户为常用的命令设置简短的别名&#xff0c;从而减少重复输入复杂命令的时间&#xff0c;提高工作效率。尤其是在命令行操作中&#xff0c;alias…

vue-cli项目配置使用unocss

在了解使用了Unocss后&#xff0c;就完全被它迷住了。接手过的所有项目都配置使用了它&#xff0c;包括一些旧项目&#xff0c;也跟同事分享了使用Unocss的便捷性。 这里分享一下旧项目如何配置和使用Unocss的&#xff0c;项目是vue2vue-cli构建的&#xff0c;node<20平常开…

新增文章分类功能

总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 目录 总说 一、功能实现 1.1 Controller层 1.2 Service层 1.3 Impl层 1.4 Mapper层 1.5 测试接口 二、优化 2.1 2.2 一、…

MERN全栈脚手架(MongoDB、Express、React、Node)与Yeoman详解

MERN 全栈脚手架是一种用于快速构建基于 MongoDB、Express、React 和 Node.js 的全栈应用的框架或模板。它帮助开发者快速启动项目&#xff0c;减少了从零开始配置的时间。以下是关于 MERN 全栈脚手架的详细解析。 一、MERN 技术栈简介 MongoDB: 文档型数据库&#xff0c;用于…

知识图谱常见的主流图数据库

在知识图谱中&#xff0c;主流使用的图数据库包括以下几种&#xff1a; Neo4j&#xff1a;这是目前全球部署最广泛的图数据库之一&#xff0c;具有强大的查询性能和灵活的数据模型&#xff0c;适用于复杂关系数据的存储和查询。 JanusGraph&#xff1a;JanusGraph是一个开源的…

【进程与线程】进程的PID

什么是 PID&#xff1f; PID&#xff08;Process Identifier&#xff0c;进程标识符&#xff09;是操作系统为每个进程分配的一个唯一标识&#xff0c;用于标识系统中的每个进程。PID 是一个非负整数&#xff0c;通常从 1 开始分配&#xff1b;每个运行中的进程都有一个唯一的…

学习python类的总结

前言 之前天天看到有人用类相关的知识但是学校老师就是没讲过&#xff0c;然后再读了莫烦老师的讲解后&#xff0c;有了一定的了解&#xff0c;进行一个总结。 正文 类的意义 类其实就是正如他的名字一样&#xff0c;是一类事物&#xff08;其实叫做对象&#xff09;的总称…

JavaSE学习心得(多线程与网络编程篇)

多线程-网络编程 前言 多线程&JUC 多线程三种实现方式 第一种实现方式 第二种实现方式 第三种实现方式 常见成员方法 买票引发的安全问题 同步代码块 同步方法 Lock锁 生产者和消费者 常见方法 等待唤醒机制 练习 抢红包 抽奖 多线程统计并求最…

Pytorch基础教程:从零实现手写数字分类

文章目录 1.Pytorch简介2.理解tensor2.1 一维矩阵2.2 二维矩阵2.3 三维矩阵 3.创建tensor3.1 你可以直接从一个Python列表或NumPy数组创建一个tensor&#xff1a;3.2 创建特定形状的tensor3.3 创建三维tensor3.4 使用随机数填充tensor3.5 指定tensor的数据类型 4.tensor基本运算…

candb++ windows11运行报错,找不到mfc140.dll

解决问题记录 mfc140.dll下载 注意&#xff1a;放置位置别搞错了

​公专网一体5G工业路由器,智慧电网全链路加密监控管理

随着可再生能源的集成 电网调度策略复杂性增加 需更精细的并网管理以平衡供需 传统电力网络的通信基础落后 难以适应电力设施的广泛分布 和日益增长的管理维护需求 计讯物联5G公专网一体路由器 通过融合公网和专网的优势 有效解决了现代电网对于 高效、灵活和安全通信的需求 ↓…

【Linux】--- 进程的等待与替换

进程的等待与替换 一、进程等待1、进程等待的必要性2、获取子进程status3、进程等待的方法&#xff08;1&#xff09;wait&#xff08;&#xff09;函数&#xff08;2&#xff09;waitpid函数 4、多进程创建以及等待的代码模型5、非阻塞接口 轮询 二、进程替换1、替换原理2、替…

intel x99主板设置上电服务器自动启动

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 1、选择IntelRCStetup–>PCH state after G3 -->ON PCH state after G3&#xff1a;是指系统完全关闭电源的状态&#xff0c;此时主板上只有RTC&#xff08;实时时钟&#xff09;电源。这个选项决定了系…

机器学习-归一化,标准化

标准化&#xff08;Standardization&#xff09;是将数据按比例缩放&#xff0c;使其具有特定的统计特征&#xff0c;通常是将数据的均值调整为0&#xff0c;标准差调整为1。标准化是一种常见的数据预处理技术&#xff0c;特别是在进行机器学习时&#xff0c;通常会使用标准化来…

zerotier搭建虚拟局域网,自建planet

基于该开源项目 自建planet节点&#xff0c;更快速&#xff0c;更安全 本教程依据docker-zerotier-planet 项目文档书写&#xff0c;并以linux(centos 7)和windows作为示例&#xff0c;需要其他系统配置方法&#xff0c;可移步项目文档 一. 前置资源 具有外网ip的服务器 后面…

Spring Boot + MyBatis-Flex 配置 ProxySQL 的完整指南

✅ Spring Boot MyBatis-Flex 配置 ProxySQL 的完整指南 下面是一个详细的教程&#xff0c;指导您如何在 Spring Boot 项目中使用 MyBatis-Flex 配置 ProxySQL 进行 读写分离 和 主从同步 的数据库访问。 &#x1f3af; 目标 在 Spring Boot 中连接 ProxySQL。使用 MyBatis-…

如何解决Webview和H5缓存问题,确保每次加载最新版本的资源

WebView 用于加载 H5 页面是常见的做法&#xff0c;它能够加载远程的 HTML、CSS、JavaScript 资源&#xff0c;并且让 Web 应用嵌入到原生 App 中。然而&#xff0c;WebView 的缓存机制有时会导致用户看到的是旧版本的页面或资源&#xff0c;尤其是在 H5 发版后&#xff0c;iOS…