【问题标题】:How can I hide datagridview row whenever a column value equals specific value每当列值等于特定值时,如何隐藏 datagridview 行
【发布时间】:2021-04-14 20:25:32
【问题描述】:

例如,

我有这个绑定到数据表的数据网格视图:

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 中显示一些行,但它没有。

【问题讨论】:

    标签: c# algorithm datatable datagridview visibility


    【解决方案1】:

    这要简单得多。对于像这样绑定的 datagridview:

    myDgv.DataSource = dt;
    

    我们可以像这样动态过滤dgv:

    dt.DefaultView.RowFilter = "[B] = 5"; //only show rows where B is 5
    

    当 DGV 的 DataSource 设置为数据表时,它会绑定到 DefaultView 属性导出的 DataView,以便您可以更改视图的属性,如过滤器和排序,它会影响 DGV。您还可以选择基于表创建自己的 DataView 并将 DGV 绑定到该表。有关可以在 RowFilter 中使用的语法的更多信息,请查看 DataColumn.Expression

    在处理绑定数据时,请尽量养成通过查看容器(数据表)而不是枚举 DGV 并从中提取值来访问数据的习惯

    您可能会发现将数据表绑定到 BindingSource 然后将 BindingSource 绑定到 DGV 更有用 - 绑定源还具有具有相同语法的 Filter 属性,但在用户更改时还保持当前行的概念/ DGV 中的当前行 bindingsource 上 Current 属性的值发生变化,从而更容易在代码中操作当前行


    您表示这一切都是在表单设计器中设置的,这意味着您的表单上有:

    • 名为 _xDataGridView 的数据网格视图
    • 一个名为 _xBindingSource 的绑定源
    • 名为 _xDataSet 的数据集
    • bindingsource的DataSource设置为dataset,datamember设置为dataset中的表名,datagridview的DataSource设置为bindingsource

    (我主要是在描述设置以确保它是正确的)

    您需要做的就是:

    _xBindingSource.Filter = "[B] = 5";
    

    【讨论】:

    • 如果我已经使用 winforms 绑定了数据怎么办(我从工具箱添加了 datagridview 并刚刚添加了 bindingsource,所有这些都在没有代码的 winforms 上,然后我按照我的意愿编辑了列),我应该创建一个新的“DataTable dt;”使用此过滤器还是有其他方法?
    • 不,只需使用 Winforms Designer 为您制作的控件(如果您查看 Form.Designer.cs,您会看到所有 winforms Designer 实际上所做的就是设置 yourDatagridview.DataSource = yourBindingsource) .我会进行编辑
    • 谢谢我错过了信息,绑定源有一个过滤器属性,现在它很有意义,因为它成功了。
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多