如何在一个数据网格中使用两个过滤器

时间:2010-12-08 14:48:26

标签: c# .net wpf datagrid filter

我有一个数据网格,我用它来显示两个不同的数据源。我有一个过滤器用于其中一个数据源,但它适用于另一个数据源。基本上,一个数据网格显示第一个数据源,然后我可以单击一个按钮切换到同一网格中的另一个数据源,但我无法过滤这个。

以下是第一个有效的数据源过滤器的代码:

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

            }
        }

2 个答案:

答案 0 :(得分:0)

所以,如果它没有做你认为它应该做的事情,它在做什么?

你是否回到空白的数据网格,是不是在过滤,发生了什么?

另外,您是否尝试逐步执行代码并检查不同阶段的变量值,以查看问题是否存在于后端代码中,或者是否与DataGrid接口有关?

答案 1 :(得分:0)

我认为问题在于这个功能

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

在这个函数中你正在设置datacontext,我认为你应该设置DataSource。

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