每当列值等于特定值时,如何隐藏 datagridview 行
How can I hide datagridview row whenever a column value equals specific value
例如,
我有这个绑定到数据表的数据网格视图:
A
B
C
1
4
7
2
5
8
3
6
9
B 是我要检查其值的列,例如我保存的 int 值为 5。代码应检查 B 列中是否有值 5,如果为真则所有行值为 5 的可见性设置为 true,所有其他行的可见性设置为 false。
现在,我已经尝试了这个小代码(虽然它检查了所有单元格但不是按特定列):
foreach (DataGridViewRow row in dataGridView1.Rows)
{
for (int i = 0; i < row.Cells.Count; i++)
{
int rowIndex = row.Index;
if (row.Cells[i].Value.ToString().Equals("16"))
{
CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager1.SuspendBinding();
dataGridView1.Rows[rowIndex].Visible = true;
currencyManager1.ResumeBinding();
}
else
{
CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager1.SuspendBinding();
dataGridView1.Rows[rowIndex].Visible = false;
currencyManager1.ResumeBinding();
}
}
}
现在关于这个 CurrencyManager,当我试图在没有它的情况下隐藏行时,它只是让我出错,但现在所有行的可见性都设置为 false。问题是我不知道在哪里查看以及如何修复它,即使代码检查了单元格,代码中的值“16”应该在 datagridview 中显示一些行,但它没有。
简单多了。对于像这样绑定的数据网格视图:
myDgv.DataSource = dt;
我们可以像这样动态过滤dgv:
dt.DefaultView.RowFilter = "[B] = 5"; //only show rows where B is 5
当 DGV 的数据源设置为数据table 时,它会绑定到由 DefaultView 属性 导出的 DataView,这样您就可以更改视图的属性,例如筛选和排序,并且它将影响 DGV。您还可以选择基于 table 创建自己的 DataView 并将 DGV 绑定到它。有关可在 RowFilter 中使用的语法的更多信息,请查看 DataColumn.Expression
使用绑定数据时,请尝试养成通过查看容器(数据table)访问数据的习惯,而不是枚举 DGV 并从中提取值
您可能会发现将数据table 绑定到 BindingSource,然后将 BindingSource 绑定到 DGV 更有用 - 绑定源也有一个具有相同语法的过滤器 属性,但也保持当前行的概念/ 当用户更改 DGV 中的当前行时,绑定源上的 Current 属性 值发生变化,从而更容易在代码
中操作当前行
您表示这一切都是在表单设计器中设置的,这意味着您的表单上有:
- 名为 _xDataGridView 的数据网格视图
- 名为 _xBindingSource 的绑定源
- 名为 _xDataSet 的数据集
- bindingsource的DataSource设置为dataset,datamember设置为dataset中的table名称,datagridview的DataSource设置为bindingsource
(大多数时候我只是在描述设置以确保它是正确的)
您只需:
_xBindingSource.Filter = "[B] = 5";
例如,
我有这个绑定到数据表的数据网格视图:
A | B | C |
---|---|---|
1 | 4 | 7 |
2 | 5 | 8 |
3 | 6 | 9 |
B 是我要检查其值的列,例如我保存的 int 值为 5。代码应检查 B 列中是否有值 5,如果为真则所有行值为 5 的可见性设置为 true,所有其他行的可见性设置为 false。
现在,我已经尝试了这个小代码(虽然它检查了所有单元格但不是按特定列):
foreach (DataGridViewRow row in dataGridView1.Rows)
{
for (int i = 0; i < row.Cells.Count; i++)
{
int rowIndex = row.Index;
if (row.Cells[i].Value.ToString().Equals("16"))
{
CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager1.SuspendBinding();
dataGridView1.Rows[rowIndex].Visible = true;
currencyManager1.ResumeBinding();
}
else
{
CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[dataGridView1.DataSource];
currencyManager1.SuspendBinding();
dataGridView1.Rows[rowIndex].Visible = false;
currencyManager1.ResumeBinding();
}
}
}
现在关于这个 CurrencyManager,当我试图在没有它的情况下隐藏行时,它只是让我出错,但现在所有行的可见性都设置为 false。问题是我不知道在哪里查看以及如何修复它,即使代码检查了单元格,代码中的值“16”应该在 datagridview 中显示一些行,但它没有。
简单多了。对于像这样绑定的数据网格视图:
myDgv.DataSource = dt;
我们可以像这样动态过滤dgv:
dt.DefaultView.RowFilter = "[B] = 5"; //only show rows where B is 5
当 DGV 的数据源设置为数据table 时,它会绑定到由 DefaultView 属性 导出的 DataView,这样您就可以更改视图的属性,例如筛选和排序,并且它将影响 DGV。您还可以选择基于 table 创建自己的 DataView 并将 DGV 绑定到它。有关可在 RowFilter 中使用的语法的更多信息,请查看 DataColumn.Expression
使用绑定数据时,请尝试养成通过查看容器(数据table)访问数据的习惯,而不是枚举 DGV 并从中提取值
您可能会发现将数据table 绑定到 BindingSource,然后将 BindingSource 绑定到 DGV 更有用 - 绑定源也有一个具有相同语法的过滤器 属性,但也保持当前行的概念/ 当用户更改 DGV 中的当前行时,绑定源上的 Current 属性 值发生变化,从而更容易在代码
中操作当前行您表示这一切都是在表单设计器中设置的,这意味着您的表单上有:
- 名为 _xDataGridView 的数据网格视图
- 名为 _xBindingSource 的绑定源
- 名为 _xDataSet 的数据集
- bindingsource的DataSource设置为dataset,datamember设置为dataset中的table名称,datagridview的DataSource设置为bindingsource
(大多数时候我只是在描述设置以确保它是正确的)
您只需:
_xBindingSource.Filter = "[B] = 5";