C# winforms DataGridView 隐藏行 解决“与货币管理器的位置关联的行不能设置为不可见”

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


编写数据处理程序当然要过滤数据,过滤数据的一种策略是隐藏不需要显示的数据。这种策略的好处是纯客户端/前端操作,不需要重新查询数据。

目录

一、如何隐藏行

二、异常:与货币管理器的位置关联的行不能设置为不可见

三、原因

四、解决方案1:取消当前单元格

五、解决方案2:临时挂起数据绑定


一、如何隐藏行

隐藏行相当简单:

cs 复制代码
				for (int i = dataGridView.RowCount - 1; i >= 0; --i)//这里倒着处理,如果你要改成删除,那么倒着处理不会出BUG
				{
					bool bMatched = false;
					......//在这里判断是否匹配
					if (!bMatched)
					{
						dataGridView.Rows[i].Visible = false;//不匹配的隐藏
					}
				}

只需要设置行的Visible属性为false就可以了。

二、异常:与货币管理器的位置关联的行不能设置为不可见

但是在使用DataGridView的时候会发现,"有时候"会触发如下异常:

为什么说"有时候"呢?因为有些情况下不触发、有些情况触发。

三、原因

经过一些跟踪分析发现,如果被隐藏的行是当前行就会触发异常:

带三角形指示的就是当前行。

注意,这个异常是和当前行(包含当前单元格)有关的,与行的Selected属性并不相关(选中行仅仅是高亮,与当前编辑的单元格没有关系)。

四、解决方案1:取消当前单元格

DataGridView默认是有一个当前单元格的,但是试了一下,发现直接设为null就可以避免这个异常了:

cs 复制代码
						dataGridView.CurrentCell = null;
						dataGridView.Rows[i].Visible = false;

取消当前单元格后就没有三角形指示了。

当然也可以把当前单元格移动到下一行或者上一行,但是如果是最后一行怎么办呢?

五、解决方案2:临时挂起数据绑定

这个方案是网上的标准方案,代码比较晦涩:

cs 复制代码
			CurrencyManager cm = (CurrencyManager)BindingContext[dataGridView.DataSource];
			cm.SuspendBinding();//挂起数据绑定
			{
				。。。。。。
						dataGridView.Rows[i].Visible = false;
                。。。。。。
			}
			cm.ResumeBinding();//恢复数据绑定

实测这么包一下也是可以解决问题的。


(这里是文档结束)

相关推荐
badhope18 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园19 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
C++ 老炮儿的技术栈19 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl19 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
Liu6288819 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
IT猿手19 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
AI科技星20 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
sunwenjian88620 小时前
Java进阶——IO 流
java·开发语言·python
波特率11520020 小时前
const关键字与函数的重载
开发语言·c++·函数重载
FL162386312920 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#