【问题标题】:DataGridView Filter not workingDataGridView 过滤器不起作用
【发布时间】:2012-07-09 06:35:49
【问题描述】:

我知道有很多关于这个主题的主题,但我已经尝试了所有方法,但仍然无法过滤我的 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();
}

有什么帮助吗?或至少解释为什么这不起作用?我已经为此工作了好几个小时,但似乎无法在任何地方找到答案

【问题讨论】:

    标签: c# winforms datagridview filter


    【解决方案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

    【讨论】:

      【解决方案2】:

      有一个在数据网格视图上创建过滤器的库:

      DataGridView Filter Popup

      问候

      【讨论】:

      • 试过了,并且在将它设置为绑定源之前将 dgv 数据源设置为空。当我打破并检查 bindingsource 的属性时,Filter 属性设置正确,但 datagridview 仍然没有被过滤
      • 好的,所以我发现道具 SupportsFiltering = false。 msdn.microsoft.com/en-us/library/… 我还是不明白为什么。 BindingList 不应该实现这个接口吗?
      • @user782838 BindingList 根本没有实现任何过滤。所有过滤都在 BindingSource 中完成。
      • 那么我如何才能将 SupportsFiltering 属性设置为 true?
      • 调试时是否 (ManufacturerService.GetAll(_ctx)) 填充绑定列表的数据源?
      【解决方案3】:

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

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

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

      你可以这样设置:-

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

      如果你这样做,你甚至不必刷新你的数据网格,它会自动完成。

      希望这会有所帮助。

      【讨论】:

      • 我还没试过这个。这我必须先编写代码来将我的绑定列表或通用列表转换为数据表。
      • ManufacturerService.GetAll(_ctx) 实际上是做什么的?
      【解决方案4】:

      我通过使用这个项目解决了这个问题: 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());
              }
          );           
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 2014-08-24
        • 2018-01-04
        • 2020-12-23
        • 2016-10-08
        • 2014-11-17
        • 2017-08-30
        相关资源
        最近更新 更多