2010-12-08 4 views
0

두 개의 다른 데이터 소스를 번갈아 가며 사용하는 하나의 DataGrid가 있습니다. 데이터 소스 중 하나에 대해 필터가 작동하지만 다른 필터에 대해 작동하는 필터가 있습니다. 기본적으로, 첫 번째 데이터 소스를 보여주는 하나의 데이터 그리드, 그 다음 동일한 그리드의 다른 데이터 소스로 전환하기 위해 버튼을 클릭 할 수 있지만 이것을 필터링 할 수는 없습니다. 여기하나의 데이터 격자에 두 개의 필터를 사용하는 방법

I 작동 첫 번째 데이터 소스의 필터가 코드입니다 :

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

그리드에서 첫 번째 데이터 소스를 볼 때 필터 입력란에 입력하면 괜찮습니다. 버튼을 클릭하여 두 번째 데이터 소스를 볼 때 그리드가 채워지는 경우 그리드를 필터링 할 수 없습니다. 유형 상자에 입력하면 아무 일도 일어나지 않습니다. –

+0

@Joe 그냥 확인하려면 올바른 테이블을 검색하고 각 행에 대해 올바른 true/false를 반환하는지 확인하기 위해 디버깅하는 동안 FilterDataGrid를 단계별로 실행 했습니까? – guildsbounty

+0

지금 진행 중입니다. 디버깅은 내가 아직도 배우고있는 것입니다. 그러나이 방법은 문제를 일으키는 것으로 보입니다. –

0

내가 문제가 당신이 데이터 컨텍스트를 설정하고이 기능에서이 기능

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

에서 생각, 난 당신이 대신 데이터 소스를 설정한다고 생각합니다.

dgPortStatus.DataSource = _dicPortStatus[selectedGroup].Portstatus.DefaultView; 
관련 문제