【问题标题】:How to filter DataGridView in C# Win Forms?如何在 C# Winforms 中过滤 DataGridView?
【发布时间】:2014-03-17 16:33:09
【问题描述】:

伙计们,我通过工具箱创建了一个简单的 datagridview,并通过向导从数据库中选择了数据(.cs 文件中没有代码)。如下图所示,它运行良好。

现在我想按联系人姓名过滤其中的条目。我有一个文本框和搜索按钮,因此当用户输入“联系人姓名”(例如“Altaf”)然后单击搜索时,gridview 应该会刷新,并且只会出现 ticketid=4 的条目。

.cs 文件中唯一的代码是:(它是自动生成的)

       private void Form2_Load(object sender, EventArgs e)
    { 
        this.tblTicketDetailTableAdapter.Fill(this.sTDataSet1.tblTicketDetail); //auto-generated
    }

我按照某人的建议在 buttonClick 事件中尝试了此操作,但它生成错误:“无法在位置 27 解释令牌 '{'”

        BindingSource bs = new BindingSource();
        bs.DataSource = dataGridView1.DataSource;
        bs.Filter = issuerNameDataGridViewTextBoxColumn + "like '%" + txtbxSearch.Text.Trim().Replace("'", "''") + "%'";
        dataGridView1.DataSource = bs.DataSource;

我在datagridviews或win form编码方面没有经验,所以请详细解释。非常感谢您的帮助。

问候。

【问题讨论】:

  • 你不过滤DataGridView,你过滤它绑定的DataTable。
  • 我该怎么做呢?我以前没用过DataTable。
  • 您正在使用数据表:this.sTDataSet1.tblTicketDetail。调用 Select 方法并将生成的对象绑定到 GridView。 stackoverflow.com/questions/3362260/…

标签: c# winforms visual-studio-2012 gridview datagridview


【解决方案1】:

感谢所有回答我问题的人,非常感谢你们的帮助。你们是最有帮助的一群人。

我通过对我的代码进行以下修改解决了我的问题:

    public void btnSearch_Click(object sender, EventArgs e)
    {
        BindingSource bs = new BindingSource();
        bs.DataSource = dataGridView1.DataSource;
        bs.Filter = dataGridView1.Columns[5].HeaderText.ToString() + " LIKE '%" + txtbxSearch.Text + "%'";
        dataGridView1.DataSource = bs;
    }

再次感谢您。

【讨论】:

  • 另一种类似的方法是过滤 DGV 绑定的数据表。如果您在 dataTable1 中有对该表的引用,则可以使用如下语法:dataTable1.DefaultView.RowFilter = $"[{fieldName}] LIKE '%{textBoxFilter.Text}%'"; 这种方法有一些微妙之处 - 请阅读文章DataGridView Filter in C#
【解决方案2】:

试试这个:

foreach (System.Windows.Forms.DataGridViewRow r in MyGridView.Rows)
{
      if ((r.Cells[5].Value).ToString().ToUpper().Contains(searchText.ToUpper()))
      {
            MyGridView.Rows[r.Index].Visible = true;
            MyGridView.Rows[r.Index].Selected = true;
      }
      else
      {
            MyGridView.CurrentCell = null;
            MyGridView.Rows[r.Index].Visible = false;
      }
 }

【讨论】:

  • 它工作正常,但是当我双击按钮时 - 它会显示 datagridview 中的所有行。
  • 我自己查过了。但它没有遇到任何问题。使用断点并检查每一行。
  • 使用其 Visible 属性隐藏 DGV 行对于 1000 多行变得非常慢。不要将这种技术用于巨大的网格 - 尽管实现一些高级过滤器(例如按多列过滤 DGV 等)可能很有用。
【解决方案3】:

我希望我能很好地解决你的问题

string whereClause = "ContactPerson=" +textbox.text;
(datagridview.DataSource as DataTable).DefaultView.RowFilter = whereClause;

【讨论】:

  • 生成错误:对象引用未设置为对象的实例。
  • @Shajee Afzal:你是如何设置 datagridview 数据源的?
  • 我已经在我的 OP 中提到 gridview 是通过向导生成的,我没有进行任何手动编码。我不知道如何手动设置 datagridview 数据源。
  • @ShajeeAfzal:看看DatagridView 属性,告诉我它的Datasource,它是什么?
  • 它是“tblTicketDetailBindingSource”
【解决方案4】:

您可以使用dataGridView1.Rows[iIndex].Visible 来过滤dataGridView,以防您没有数据源。而如果启用了列宽的 AutoSizeMode,这可能会非常慢。 (至少我有这个问题)。
解决的办法是暂时关闭AutoSizeMode,然后这样过滤很快:

for (int z = 0; z < dataGridView1.Columns.Count; z++)
{ // Disabled AutoSize Mode for all columns
  dataGridView1.Columns[iRow].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
}

for (int iRow = 0; iRow <= dataGridView1.RowCount; iRow++)
{ // Filtering dataGridView1
  bool bVisibleCondition = ...
  dataGridView1.Rows[iRealRow].Visible = bVisibleCondition;
}

for (int z = 0; z < dataGridView1.Columns.Count; z++)
{ // Enable AutoSize Mode for all columns
  dataGridView1.Columns[z].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2011-10-08
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多