2010-12-08 29 views
0

2つの異なるデータソースの表示を切り替えるために使用する1つのデータグリッドがあります。私は、データソースの1つのために働いているフィルターを持っていますが、それは他のもののために働いています。基本的には、最初のデータソースを表示する1つのデータグリッド。ボタンをクリックすると、同じグリッド内の他のデータソースに切り替えることができますが、これをフィルタリングすることはできません。1つのデータグリッドで2つのフィルタを使用する方法

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; 
        } 
       } 

      } 
     } 

答えて

0

をだから、あなたがそれは、それが何をやって-is-べきだと思う何をやっていない場合:ここでは

は、私が働く最初のデータソースにフィルタを持っているコードですか?

空のデータグリッドを返されましたか、フィルタリングされていません、何が起こっていますか?

また、さまざまな段階でコードをステップ実行して変数値をチェックして、問題がバックエンドコード内にあるのか、それともDataGridとのインターフェイスにあるのか確認しましたか?

+0

グリッド内の最初のデータソースを表示しているときにフィルタテキストボックスに入力すると、フィルタが正常に機能します。ボタンをクリックして2番目のデータソースを表示すると、グリッドにデータが取り込まれます...グリッドをフィルタリングできません。タイプボックスに入力すると何も起こりません。 –

+0

@Joeちょうど、あなたが正しいテーブルを検索していて、各行に対して正しい真/偽を返すかどうかを確認するために、デバッグ中にFilterDataGridを踏んだことを確認しますか? – guildsbounty

+0

私は今それを進めています。デバッグは私がまだ学んでいるものです。しかし、この方法は問題を引き起こしているように見えます。 –

0

私は、問題は、この機能では、あなたがのDataContextに設定されているこの機能で

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

だと思う、私はあなたが代わりにDataSourceを設定すべきだと思います。

dgPortStatus.DataSource = _dicPortStatus[selectedGroup].Portstatus.DefaultView; 
関連する問題