두 개의 다른 데이터 소스를 번갈아 가며 사용하는 하나의 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;
}
}
}
}
그리드에서 첫 번째 데이터 소스를 볼 때 필터 입력란에 입력하면 괜찮습니다. 버튼을 클릭하여 두 번째 데이터 소스를 볼 때 그리드가 채워지는 경우 그리드를 필터링 할 수 없습니다. 유형 상자에 입력하면 아무 일도 일어나지 않습니다. –
@Joe 그냥 확인하려면 올바른 테이블을 검색하고 각 행에 대해 올바른 true/false를 반환하는지 확인하기 위해 디버깅하는 동안 FilterDataGrid를 단계별로 실행 했습니까? – guildsbounty
지금 진행 중입니다. 디버깅은 내가 아직도 배우고있는 것입니다. 그러나이 방법은 문제를 일으키는 것으로 보입니다. –