C# 如何在一个数据网格中使用两个过滤器
我有一个数据网格,我正在使用它来交替显示两个不同的数据源。我有一个用于其中一个数据源的过滤器,但它不适用于另一个数据源。基本上,一个数据网格显示第一个数据源,然后我可以单击按钮切换到同一网格中的另一个数据源,但我不能过滤这个数据源 以下是我为第一个工作的数据源上的过滤器编写的代码:C# 如何在一个数据网格中使用两个过滤器,c#,.net,wpf,datagrid,filter,C#,.net,Wpf,Datagrid,Filter,我有一个数据网格,我正在使用它来交替显示两个不同的数据源。我有一个用于其中一个数据源的过滤器,但它不适用于另一个数据源。基本上,一个数据网格显示第一个数据源,然后我可以单击按钮切换到同一网格中的另一个数据源,但我不能过滤这个数据源 以下是我为第一个工作的数据源上的过滤器编写的代码: private Dictionary<string, PortStatus> _dicPortStatus = new Dictionary<string, PortStatus>();
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;
}
}
}
}
private Dictionary\u dicPortStatus=new Dictionary();
私有无效CMB组\u选择已更改(对象发送方,选择更改已发送)
{
//组合框选择已更改。请重新绑定数据
字符串selectedGroup=(字符串)cmbGroups.SelectedItem;
//重新绑定网格
dgPortStatus.DataContext=_dicPortStatus[selectedGroup].Portstatus.DefaultView;
}
私有void txtFilterIn_TextChanged(对象发送者,textchangedventargs e)
{
FilterDataGrid(txtFilterIn.Text、txtFilterOut.Text、_dicPortStatus[cmbGroups.SelectedItem.ToString());
}
私有无效btnFilterInClear\u单击(对象发送者,路由目标)
{
txtFilterIn.Clear();
}
私有void txtFilterOut_TextChanged(对象发送者,textchangedventargs e)
{
FilterDataGrid(txtFilterIn.Text、txtFilterOut.Text、_dicPortStatus[cmbGroups.SelectedItem.ToString());
//((CollectionView)dgPortStatus.ItemsSource.Refresh();
}
私有无效btnFilterOutClear\u单击(对象发送者,路由目标)
{
txtFilterOut.Clear();
}
私有void FilterDataGrid(字符串inText、字符串outText、数据集ds)
{
如果(ds!=null)
{
如果(!string.IsNullOrEmpty(inText)| |!string.IsNullOrEmpty(outText))
{
foreach(ds.表中的数据表dt)
{
StringBuilder sbFilter=新的StringBuilder();
foreach(数据列dc在dt.列中)
{
if(dc.DataType==typeof(string))
{
如果(!string.IsNullOrEmpty(inText))
{
如果(sbFilter.Length>0)
sbFilter.追加(“或”);
sbFilter.Append(“”);
sbFilter.Append(dc.ColumnName+“类似“%”+inText+“%”);
}
如果(!string.IsNullOrEmpty(outText))
{
如果(sbFilter.Length>0)
sbFilter.Append(“和”);
if(string.IsNullOrEmpty(inText))
sbFilter.Append(“”);
sbFilter.Append(dc.ColumnName+“不象“%”+outText+“%”);
}
sbFilter.Append(“)”;
}
if(dc.DataType==typeof(Int32)| | dc.DataType==typeof(Double))
{
如果(!string.IsNullOrEmpty(inText))
{
如果(sbFilter.Length>0)
sbFilter.追加(“或”);
sbFilter.Append(“”);
sbFilter.Append(“CONVERT”(“+dc.ColumnName+”,System.String)”+“类似“%”+inText+“%”);
}
如果(!string.IsNullOrEmpty(outText))
{
如果(sbFilter.Length>0)
sbFilter.Append(“和”);
if(string.IsNullOrEmpty(inText))
sbFilter.Append(“”);
sbFilter.Append(“CONVERT(“+dc.ColumnName+”,System.String)”+“与“%”+outText+“%”不同;
}
sbFilter.Append(“)”;
}
}
dt.DefaultView.RowFilter=sbFilter.ToString();
}
}
其他的
{
foreach(ds.表中的数据表dt)
{
dt.DefaultView.RowFilter=String.Empty;
}
}
}
}
那么,如果它没有做你认为它应该做的事情,它在做什么
你得到的是一个空白的数据网格,不是过滤,发生了什么
另外,您是否尝试过在不同阶段单步执行代码并检查变量值,以查看问题是否存在于后端代码中,或者是否存在于与DataGrid的接口中?我认为问题在于此函数
dgPortStatus.DataContext = _dicPortStatus[selectedGroup].Portstatus.DefaultView;
在这个函数中,您正在设置datacontext,我认为您应该改为设置DataSource
dgPortStatus.DataSource = _dicPortStatus[selectedGroup].Portstatus.DefaultView;
当我在查看网格中的第一个数据源时,在“筛选”文本框中键入时,它会过滤良好。当我单击按钮查看第二个数据源时,它会填充网格…然后我就无法筛选网格。我在“类型”框中键入时,什么也没有发生。@Joe只是想确认一下,您是否在调试以查看它是否正在搜索正确的表并为每一行返回正确的true/false?我现在正在逐步完成它。调试是我仍在学习的内容。但这种方法似乎是导致问题的原因。如果您以前没有处理过它,那么在调试时,如果您选择了t