我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
编写数据处理程序当然要过滤数据,过滤数据的一种策略是隐藏不需要显示的数据。这种策略的好处是纯客户端/前端操作,不需要重新查询数据。
目录
一、如何隐藏行
隐藏行相当简单:
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();//恢复数据绑定
实测这么包一下也是可以解决问题的。
(这里是文档结束)