实现类似Excel的筛选

server/2025/1/20 1:29:30/

以下是在 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.ppmy.cn/server/159769.html

相关文章

图像分类、目标定位与目标检测的区别详解:定义、工作原理、应用场景

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

青少年编程与数学 02-007 PostgreSQL数据库应用 02课题、PostgreSQL数据库安装

青少年编程与数学 02-007 PostgreSQL数据库应用 02课题、PostgreSQL数据库安装 一、安装Windows系统安装PostgreSQL 17Linux系统安装PostgreSQL 17 二、配置Windows系统Linux系统 三、启动&#xff08;一&#xff09;Windows系统使用服务管理器&#xff08;services.msc&#x…

微信小程序:中途退出原页面,再次进入无法回到退出时的位置

相信很多微信小程序的开发者都会碰到这样的问题&#xff0c;那今天我们就来详细的看下如何解决 一、使用 scroll-view 组件保存滚动位置&#xff1a; 在 wxml 文件中&#xff0c;使用 scroll-view 组件包裹需要滚动的内容。在 data 中定义一个变量来存储 scroll-view 的 scro…

springweb项目练手附spring学习笔记链接

【idea新建一个web项目】Intellij IDEA 2020.1.1创建Java web项目&#xff08;详细图文教程&#xff09;_idea 2020.1.1 版本 如何创建新项目-CSDN博客 java web 期末考试 简单的网页开发 进行增删改查操作_javascript网页设计增删改查-CSDN博客 狂神说Mybatis学习笔记-CSDN博…

python matplotlib绘图,显示和保存没有标题栏和菜单栏的图像

目录 1. 使用plt.savefig保存无边框图形 2. 显示在屏幕上&#xff0c;并且去掉窗口的标题栏和工具栏 3. 通过配置 matplotlib 的 backend 和使用 Tkinter&#xff08;或其他图形库&#xff09; 方法 1&#xff1a;使用 TkAgg 后端&#xff0c;并禁用窗口的工具栏和标题栏 …

Prompt-人工智能领域的核心技术与创新理念

在人工智能领域&#xff0c;“Prompt” 是一个至关重要的概念&#xff0c;其全称为 Prompt Engineering&#xff0c;意为提示工程。Prompt是指设计和输入特定的提示语句&#xff0c;以引导大语言模型&#xff08;LLM, Large Language Model&#xff09;生成符合预期的输出。随着…

Vue.js组件开发-如何实现路由懒加载

在Vue.js应用中&#xff0c;路由懒加载是一种优化性能的技术&#xff0c;它允许在需要时才加载特定的路由组件&#xff0c;而不是在应用启动时加载所有组件。这样可以显著减少初始加载时间&#xff0c;提高用户体验。在Vue Router中&#xff0c;实现路由懒加载非常简单&#xf…

学习笔记081——如何备份服务器中MySQL数据库数据?

方法&#xff1a; 可以通过编写sh脚本的方式&#xff0c;结合Linux中的crontab定时任务来实现定时备份数据的功能。 sh脚本如下&#xff1a; #!/bin/bash# 要备份的数据库 DB_NAME"wms" # 数据库账号 DB_USER"root" # 数据库密码 DB_PASSWORD"12345…