【问题标题】:How to filter The rows in datagridview by cell value in c#如何在c#中按单元格值过滤datagridview中的行
【发布时间】:2017-10-04 16:30:52
【问题描述】:

我有一个包含 5 个单元格的表单中的 datagridview 我想在某些条件下过滤行,即第 5 个单元格值不是 0

我尝试了以下代码,但它没有正常工作

 for (int i = 0; i < frm.dataGridView1.Rows.Count; i++)
        {
            if (frm.dataGridView1.Rows[i].Cells[5].Value.ToString() == "0")
            {

                CurrencyManager currencyManager1 = (CurrencyManager)dataGridView1.BindingContext[dataGridView1.DataSource];
                currencyManager1.SuspendBinding();
               dataGridView1.Rows[i].Selected = false;
                dataGridView1.Rows[i].Visible = false;
                currencyManager1.ResumeBinding();

            }
            else
            {

               dataGridView1.Rows[i].Visible = true;
                dataGridView1.Rows[i].Selected = true;

            }
        }

我用来接收数据的存储过程

    @Criterion varchar(30)
as

SELECT [id] as 
      ,[car_num] 
      ,[customer]
      ,[driver]
      ,[first]
      ,[second] 
      ,[sum] 
      ,[price] 
      ,[date1]
      ,[date2] 
      ,[city] 
      ,[type] 


  FROM [dbo].[Data]


  where 
  [car_num]+
  [customer]+
  [driver]+
 convert (varchar, [first])+
 convert (varchar, [second])+
 convert (varchar, [sum])+
 convert (varchar, [price])
like '%' + @Criterion +'%'

【问题讨论】:

  • 我所知道的过滤 DataGridViews 的最佳通用方法是 a) 将数据保存在 DataTable 中,2) 创建一个 DataView 对象并将 DataView 的 DataSource 设置为 DataTable。 3) 将DataGridView 数据源设置为DataView。之后,您可以将 DataView 对象的 RowFilter 属性用作某种 ersatz sql 过滤器。所需的代码量最少,而且几乎可以肯定比您自己想出的任何代码都快。
  • @AvoNappo 我通过代码实现了这一点:dataView1.RowFilter = "second='0'";但这显示了包含 0 的行,我该如何做相反的事情?

标签: c# datagridview filter


【解决方案1】:

尝试以下代码并查看 cmets 了解详细信息。

            //USE A FOREACH, YOU DO NOT NEED WORRY ABOUT INDEXS (WHICH CAUSES PROBLEMS MANY TIMES)
            foreach (DataGridViewRow rowItem in dataGridView1.Rows)
            {
                //CHECK FOR OBJECT EXISTENCE BEFORE DOING ANYTHING
                //AVOID ACCESSING CELL VALUE WITH INDEX. GO WITH COLUMN NAME. NO ISSUES IF COLUMNS ARE ALTERED LATER POINT.
                if (rowItem.Cells["number"].Value != null)
                {
                    //CHECK THE VALUE AND SET VISISBLE/INVISIBLE
                    if (rowItem.Cells["number"].Value.ToString() == "0")
                        rowItem.Visible = false;
                    else
                        rowItem.Visible = true;
                }
            }

【讨论】:

  • 我试过了没有效果,我是用存储过程作为数据源,请问是这个问题的原因吗?
  • 您是否可以自行过滤存储过程中的行?
  • 是的,这是可能的,但我没有这方面的经验
  • 好的。你能再试一次吗?之前为每个执行此操作。 CurrencyManager currencyManager1 = (CurrencyManager)dataGridView1.BindingContext[dataGridView1.DataSource]; currencyManager1.SuspendBinding();
  • 它没有用,我认为解决方案将在存储过程中,我用存储过程编辑了帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
相关资源
最近更新 更多