2011-09-26 60 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。