C# 在应用TreeView筛选器后,DataGridView中会出现多余的行

C# 在应用TreeView筛选器后,DataGridView中会出现多余的行,c#,winforms,datagridview,treeview,C#,Winforms,Datagridview,Treeview,应用筛选器后显示行时出现问题。在DataGridView中,我使用动态更新 问题描述: 应用“按条件筛选”Rows.Visible=true或Rows.Visible=false后,将显示其他行,但不会显示整个新行,只显示其更新的单元格,如图所示: 需要注意的是,表更新不会发生在主线程中;更新以固定的线程延迟时间间隔进行 代码树视图1_后选择: TreeViewFilter类的一部分: 。。。等等 与前一种方法相比,这种方法也不起作用 窗体作为一个整体仍然存在不可理解的行为,缩放窗口时出现问题集

应用筛选器后显示行时出现问题。在DataGridView中,我使用动态更新

问题描述: 应用“按条件筛选”Rows.Visible=true或Rows.Visible=false后,将显示其他行,但不会显示整个新行,只显示其更新的单元格,如图所示:

需要注意的是,表更新不会发生在主线程中;更新以固定的线程延迟时间间隔进行

代码树视图1_后选择:

TreeViewFilter类的一部分:

。。。等等

与前一种方法相比,这种方法也不起作用

窗体作为一个整体仍然存在不可理解的行为,缩放窗口时出现问题集合中的第一行出现:

在.gif中,禁用动态更新DataGridView的方法!选择后的简单方法的结果

请告诉我怎么处理这件事。我没有考虑什么

.gif说明:

ааааааааГааа-类别 МА-ru的等效剂量 空气 Спец. ццццццц-特殊控制 аааааааааа-不工作

аСаааа-阈值

Пааааааааааа-事故前 Ааааааааа-事故 为了解决这个问题,我尝试使用以下方法:

string columnName = "type"; // or other column
string filterValue = "2";   // or other value
string rowFilter = string.Format("[{0}] = '{1}'", columnName, filterValue);
(mainForm.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = rowFilter;
但在这种情况下,隐藏行不再被查询,它们似乎从数据源或类似的东西中丢失了

谢谢你的帮助;我为我的英语道歉=

试试这个

将可见性属性添加到BindingSource并绑定 每行对“可见性”属性的可见性。 禁用RaiseListChangedEvents并在之后重新启用它们,以及 重置绑定,以便网格知道如何更新自身

CurrencyManager CurrencyManager=CurrencyManager绑定上下文[dataGridView1.DataSource]

currencyManager.RaiseListChangedEvents=false

//通过在绑定源中将visibility属性设置为false来禁用所有其他行

currencyManager.RaiseListChangedEvents=true

currencyManager.ResetBindings

看看这个:


使用DataBindingComplete事件禁用/启用行

我设法重现了该问题

额外的行是在CurencyManager中选择并以三角形亮显的行

解决方案选项:

在筛选方法的开头禁用CurrencyManager

CurrencyManager currencyManager = (CurrencyManager)BindingContext [dataGridView1.DataSource];
currencyManager.SuspendBinding();
标题的三角形将消失,但在某些情况下,或者在其他情况下,使用CurrentRow和CurrentCell将不起作用

将行切换到应该可见的行

dataGridView1.CurrentCell = this.dataGridView1[columnNumber, visibleRowNumber];
但在所有行都应该隐藏的情况下,这不起作用


谢谢你的回答。如何将可见性属性添加到BindingSource并将行可见性属性绑定到它?CurrencyManager没有方法RaiseListChangedEvents、ResetBindings,但BindingSource有这些方法,在我深入研究之前,您是否尝试过刷新DataGrid?或使其无效?我尝试过dataGridView1.Update;和dataGridView1.Refresh;。它没有带来任何结果。
string columnName = "type"; // or other column
string filterValue = "2";   // or other value
string rowFilter = string.Format("[{0}] = '{1}'", columnName, filterValue);
(mainForm.dataGridView1.DataSource as DataTable).DefaultView.RowFilter = rowFilter;
CurrencyManager currencyManager = (CurrencyManager)BindingContext [dataGridView1.DataSource];
currencyManager.SuspendBinding();
dataGridView1.CurrentCell = this.dataGridView1[columnNumber, visibleRowNumber];