2011-09-26 77 views
1

我有一个数据表,这是一个数据库表的数据网。我可以过滤使用下面的代码使用ICollectionView中数据网格:使用C#应用多个过滤WPF数据网格

  lstOrdsRlsd = new ObservableCollection<OrdsRlsd>(GV.dbContext.OrdsRlsds); 
      view = CollectionViewSource.GetDefaultView(lstOrdsRlsd); 

      if (lstOrdsRlsd.Count > 0) 
      { 
       dgRecords1.ItemsSource = view;     
      } 



    private void FilterRecords(string FieldName, string Condition, object Value1, object Value2) 
    { 
     OrdsRlsd vitem; 
     switch (FieldName) 
     { 
      case "OrderNo": 

       view.Filter = item => 
       { 
        vitem = item as OrdsRlsd; 
        switch (Condition) 
        { 
         case "=": 
          if (vitem.OrderNo == Convert.ToDouble(Value1)) 
           return true; 
          break; 
         case ">=": 
          if (vitem.OrderNo >= Convert.ToDouble(Value1)) 
           return true; 
          break; 
         case "<=": 
          if (vitem.OrderNo <= Convert.ToDouble(Value1)) 
           return true; 
          break; 
         case "between": 
          if (vitem.OrderNo >= Convert.ToDouble(Value1) && vitem.OrderNo <= Convert.ToDouble(Value2)) 
           return true; 
          break; 
        } 

        return false; 
       }; 
       break; 

      case "DateRqd1": 

       view.Filter = item => 
       { 
        vitem = item as OrdsRlsd; 
        switch (Condition) 
        { 
         case "=": 
          if (vitem.DateRqd1 == Convert.ToDateTime(Value1)) 
           return true; 
          break; 
         case ">=": 
          if (vitem.DateRqd1 >= Convert.ToDateTime(Value1)) 
           return true; 
          break; 
         case "<=": 
          if (vitem.DateRqd1 <= Convert.ToDateTime(Value1)) 
           return true; 
          break; 
         case "between": 
          if (vitem.DateRqd1 >= Convert.ToDateTime(Value1) && vitem.DateRqd1 <= Convert.ToDateTime(Value2)) 
           return true; 
          break; 

        } 
        return false; 
       }; 
       break; 

}

这对我的作品的时候,只有一个过滤条件。但是,当我应用多个条件的数据网格过滤器的最后一个条件。这是用户单击过滤器按钮时执行的代码。

private void BtnFilter_Click(object sender, RoutedEventArgs e) 
    { 
     foreach (var rec in lstClsFilterGrid) 
     { 
      FilterRecords(rec.FieldName, rec.Condition, rec.Value1, rec.Value2); 
     } 

    } 

其中lstClsFilterGrid是具有过滤条件的类对象的列表。

我附上我的表单的屏幕截图。 enter image description here

回答

2

所以这个表单上的工作流程是:用户创建一个条件来过滤,并可以选择过滤集合或添加另一个条件,是否正确?

如果是这样,那么你将不得不能够传递一组条件(可能是一个重载的过滤器方法)。

我之前在多个(固定)条件下过滤(即绑定到映射到预先安排条件的属性的几个复选框,例如“过去30天”,“完成订单”,“过期货件”等)。

我的过滤器会根据所有这些属性检查项目。就你而言,你有不确定数量的动态条件。

如果这是我,我会有一个列表添加条件,然后将整个集合传递给一个过滤方法,然后每个对象都必须满足for循环中的所有条件才能返回true。