DataGridView过滤器无法正常工作

时间:2012-07-09 06:35:50

标签: c# winforms datagridview filter

我知道在这个主题上有很多线程,但我已经尝试了所有内容,但仍然无法过滤我的datagridview。我试图根据用户在文本字段中输入的值来过滤datagridview的行。 datagridviews数据源设置在下面提供的数据源中。

所以这是我正在使用的代码。我没有错误,datagridview根本不会改变。 ManufacturerService.GettAll返回制造商列表,我将其转换为

的绑定列表

bsManufacturers.DataSource = new BindingList<Manufacturer>(ManufacturerService.GetAll(_ctx));

在文本框的textchanged事件上运行此代码。我已经检查过断点等。执行代码,过滤字符串是正确的。

private void FilterData(string str)
{
    bsManufacturers.Filter = string.Format("Name like '%{0}%'", str);
    dgvManufacturers.Refresh();
}

有任何帮助吗?或至少解释为什么这不起作用?我一直在努力工作好几个小时,似乎无法在任何地方找到一个anwser

4 个答案:

答案 0 :(得分:1)

数据排序信息包含在网格标题中。用户可以在一个或多个标题中设置单个或多个排序。在编程级别,排序如下所示

//Get top-level header
Header header = grid.Headers[0];

header["Product"].SortDirection = SortDirection.Ascending;
header["Price"].SortDirection = SortDirection.Descending;

Column.Sortable属性设置为false足以启用纯软件排序,防止用户通过UI dapfor修改它。 COM

答案 1 :(得分:0)

有一个库在datagrid视图上创建过滤器:

DataGridView Filter Popup

此致

答案 2 :(得分:0)

我认为您不需要使用绑定列表,最好使用DataTable作为“绑定源”的数据源。

然后您可以在FilterData方法中使用以下内容: -

DataTable.DefaultView.RowFilter = string.format("Name like '%{0}%'", str);

您可以这样设置: -

Binding Source.Datasource = DataTable,
DatagridView.Datasource = Binding Source;

如果你这样做,你甚至不必刷新datatgrid,它会自动完成。

希望这有帮助。

答案 3 :(得分:0)

我使用这个项目解决了这个问题: http://blw.sourceforge.net/

就我个人而言,我认为应该有更好的方法来做到这一点,但它现在正在运作,我想我现在必须对“足够好”感到高兴。

这是工作代码。无论如何,重要的部分。

private void PopulateDataGridView()
{
     blvManufacturers = new BindingListView<Manufacturer>(ManufacturerService.GetAll(_ctx));
    _bsManufacturers = new BindingSource { DataSource = _blvManufacturers};
    dgvManufacturers.DataSource = _bsManufacturers;         
}

private void FilterData(string str)
{
    // Change the filter of the view.
      blvManufacturers.ApplyFilter(
        delegate(Manufacturer manu)
        {
            // uses ToLower() to ignore case of text.
            return manu.Name.ToLower().Contains(str.ToLower());
        }
    );           
}