2010-12-08 7 views
0

Ich habe ein Datagrid, das ich verwende, um zwischen zwei verschiedenen Datenquellen zu wechseln. Ich habe einen Filter, der für eine der Datenquellen arbeitet, aber es dosent arbeitet für den anderen. Grundsätzlich kann ein Datenraster die erste Datenquelle anzeigen, dann kann ich auf eine Schaltfläche klicken, um zu der anderen Datenquelle im selben Raster zu wechseln, aber ich kann diese nicht filtern.So verwenden Sie zwei Filter in einem Datagrid

Hier ist der Code, den ich für den Filter auf der ersten Datenquelle haben, die funktioniert:

private Dictionary<string, PortStatus> _dicPortStatus = new Dictionary<string, PortStatus>(); 

     private void cmbGroups_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      //Combo box selection changed. Re-bind data 
      string selectedGroup = (string)cmbGroups.SelectedItem; 

      //Re-bind the grid 
      dgPortStatus.DataContext = _dicPortStatus[selectedGroup].Portstatus.DefaultView; 

     } 

     private void txtFilterIn_TextChanged(object sender, TextChangedEventArgs e) 
     { 
      FilterDataGrid(txtFilterIn.Text, txtFilterOut.Text, _dicPortStatus[cmbGroups.SelectedItem.ToString()]); 
     } 

     private void btnFilterInClear_Click(object sender, RoutedEventArgs e) 
     { 
      txtFilterIn.Clear(); 
     } 

     private void txtFilterOut_TextChanged(object sender, TextChangedEventArgs e) 
     { 
      FilterDataGrid(txtFilterIn.Text, txtFilterOut.Text, _dicPortStatus[cmbGroups.SelectedItem.ToString()]); 
      //((CollectionView)dgPortStatus.ItemsSource).Refresh(); 

     } 

     private void btnFilterOutClear_Click(object sender, RoutedEventArgs e) 
     { 
      txtFilterOut.Clear(); 
     } 

     private void FilterDataGrid(string inText, string outText, DataSet ds) 
     { 
      if (ds != null) 
      { 
       if (!string.IsNullOrEmpty(inText) || !string.IsNullOrEmpty(outText)) 
       { 
        foreach (DataTable dt in ds.Tables) 
        { 
         StringBuilder sbFilter = new StringBuilder(); 
         foreach (DataColumn dc in dt.Columns) 
         { 
          if (dc.DataType == typeof(string)) 
          { 
           if (!string.IsNullOrEmpty(inText)) 
           { 
            if (sbFilter.Length > 0) 
             sbFilter.Append(" OR "); 
            sbFilter.Append("("); 
            sbFilter.Append(dc.ColumnName + " LIKE '%" + inText + "%'"); 

           } 

           if (!string.IsNullOrEmpty(outText)) 
           { 
            if (sbFilter.Length > 0) 
             sbFilter.Append(" AND "); 
            if (string.IsNullOrEmpty(inText)) 
             sbFilter.Append("("); 
            sbFilter.Append(dc.ColumnName + " NOT LIKE '%" + outText + "%'"); 
           } 
           sbFilter.Append(")"); 
          } 

          if (dc.DataType == typeof(Int32) || dc.DataType == typeof(Double)) 
          {     

           if (!string.IsNullOrEmpty(inText)) 
           { 
            if (sbFilter.Length > 0) 
             sbFilter.Append(" OR "); 
            sbFilter.Append("("); 
            sbFilter.Append("CONVERT(" + dc.ColumnName + ", System.String)" + " LIKE '%" + inText + "%'"); 

           } 

           if (!string.IsNullOrEmpty(outText)) 
           { 
            if (sbFilter.Length > 0) 
             sbFilter.Append(" AND "); 
            if (string.IsNullOrEmpty(inText)) 
             sbFilter.Append("("); 
            sbFilter.Append("CONVERT(" + dc.ColumnName + ", System.String)" + " NOT LIKE '%" + outText + "%'"); 
           } 
           sbFilter.Append(")"); 
          } 
         } 

         dt.DefaultView.RowFilter = sbFilter.ToString(); 
        } 
       } 

       else 
       { 
        foreach (DataTable dt in ds.Tables) 
        { 
         dt.DefaultView.RowFilter = String.Empty; 
        } 
       } 

      } 
     } 

Antwort

0

Also, wenn es tun, ist nicht das, was Sie denken, es sollte, was -is- es zu tun?

Erhalten Sie ein leeres Datagrid zurück, filtert es nicht, was passiert?

Haben Sie auch versucht, schrittweise durch den Code zu gehen und Variablenwerte in verschiedenen Phasen zu überprüfen, um festzustellen, ob das Problem in Ihrem Backend-Code liegt oder ob Sie mit DataGrid interagieren?

+0

Wenn ich das Filtertextfeld eintippe, wenn ich die erste Datenquelle im Raster betrachte, filtert es fein. Wenn ich auf die Schaltfläche klicke, um die zweite Datenquelle anzuzeigen, und sie das Raster auffüllt ... dann kann ich das Raster nicht filtern. Ich tippe das Feld ein und nichts passiert. –

+0

@Joe Nur um zu bestätigen, haben Sie beim Debuggen durch das FilterDataGrid gegangen, um zu sehen, ob es die richtige Tabelle durchsucht und das richtige Wahr/Falsch für jede Zeile zurückgibt? – guildsbounty

+0

Ich bin gerade dabei, durchzutreten. Debugging ist etwas, das ich noch lerne. Aber diese Methode scheint das Problem zu verursachen. –

0

ich denke Problem in dieser Funktion ist

dgPortStatus.DataContext = _dicPortStatus[selectedGroup].Portstatus.DefaultView; 

in dieser Funktion können Sie Datacontext setzen, ich glaube, Sie stattdessen Datasource setzen soll.

dgPortStatus.DataSource = _dicPortStatus[selectedGroup].Portstatus.DefaultView; 
Verwandte Themen