【问题标题】:filter data on a filtered datagrid view在过滤的数据网格视图上过滤数据
【发布时间】:2018-02-23 04:28:33
【问题描述】:
DataTable dt = new DataTable();
private void txtSearch_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Return)

        {
            DataView dv = dt.DefaultView;
            dv.RowFilter = string.Format("Description LIKE '%{0}%' OR Manufacturer LIKE '%{0}%' OR ManufacturerItemNumber LIKE '%{0}%' OR ItemNumber LIKE '%{0}%'", txtSearch.Text);
                dataGridView.DataSource = dv;                   
                dataGridView.Update();
                dataGridView.Refresh();
        }

    }

首先我连接到我的 sql 数据库,显示所有记录。然后我运行这段代码。当我在文本框中输入内容时效果很好。但我还想通过添加额外的文本框来缩小过滤结果的范围。使用第二个文本框,我想从第一个文本框中过滤过滤后的数据。

private void Descrip_txtbox_KeyDown(object sender, KeyEventArgs e)
    {
        DataView dv = dt.DefaultView;
        dt = dv.ToTable();

        if (e.KeyCode == Keys.Return)
        {       
         dv.RowFilter = string.Format("Description LIKE '%{0}%' OR Manufacturer LIKE '%{0}%' OR ManufacturerItemNumber LIKE '%{0}%' OR ItemNumber LIKE '%{0}%'", Descrip_txtbox.Text);
        dataGridView.DataSource = dv

}

我想在第一次搜索时从 txtsearch 文本框中获取过滤后的数据,然后使用下一个文本框再次过滤,依此类推。

有人可以帮帮我吗? 谢谢。

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

    假设你想要一个 AND 过滤器,它看起来像这样:

    DataView dv = ((DataView)dataGridView.DataSource);  
    
    var secondFilter = string.Format("Description LIKE '%{0}%' OR Manufacturer LIKE '%{0}%' OR ManufacturerItemNumber LIKE '%{0}%' OR ItemNumber LIKE '%{0}%'", Descrip_txtbox.Text);
    
    if ( dv.RowFilter == null || dv.RowFilter.Length == 0 )
        dv.RowFilter = secondFilter;
    else
        dv.RowFilter = "(" + dv.RowFilter & ") AND " + secondFilter;
    
    dataGridView.DataSource = dv;
    

    括号和 AND 是必需的,因为您想进一步细化过滤器,否则添加 OR 可能会导致包含更多记录。

    【讨论】:

    • 如何将过滤后的记录显示到数据网格中??以及我应该如何使用相同的代码来过滤第三个文本框?
    • 网格已经绑定到数据视图...所以更改过滤器将更改数据网格
    • 我替换了您在我的 Descrip_txtbox_KeyDown 中给我的代码行。但由于某种原因,它没有过滤掉网格上的数据。
    • 我读到您可能必须在那之后重新分配数据源 - dataGridView.DataSource = dv;
    • 感谢您帮助我。直到这里它都很好用,但是一旦我对第三个文本框使用相同的代码。它消除了第二个过滤器并与第一个过滤器合并。建议?
    【解决方案2】:

    发生的情况是您将新的value 分配给dv.RowFilter,这将清除以前的过滤器。

    您可以将新过滤器与AND 连接起来,例如:

    dv.RowFilter += " AND " + string.Format("Description LIKE '%{0}%' OR Manufacturer LIKE '%{0}%' OR ManufacturerItemNumber LIKE '%{0}%' OR ItemNumber LIKE '%{0}%'", Descrip_txtbox.Text);
    

    【讨论】:

    • 谢谢 Ehsan,我也使用了你的代码。但这最多只能工作 2 个文本框值。一旦我尝试使用第三个。它只是消除了第二个过滤器。你能帮忙吗
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2010-12-03
    • 2020-02-21
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多