Как использовать два фильтра в одной сетке данных - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть одна таблица данных, которую я использую для отображения двух разных источников данных.У меня есть фильтр, работающий для одного из источников данных, но он не работает для другого.По сути, одна сетка данных показывает первый источник данных, затем я могу нажать кнопку, чтобы переключиться на другой источник данных в той же сетке, но не могу отфильтровать этот.

Вот код, который у меня есть для фильтра на первом источнике данных, который работает:

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 голосов
/ 08 декабря 2010

я думаю, проблема в этой функции

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

в этой функции вы устанавливаете datacontext, я думаю, что вы должны установить DataSource вместо этого.

0 голосов
/ 08 декабря 2010

Так что, если он не делает то, что, как вы думаете, должен, что он делает?

Получаете ли вы пустую сетку данных, разве она не фильтруется, что происходит?

Кроме того, пытались ли вы пройтись по коду и проверять значения переменных на разных этапах, чтобы увидеть, находится ли проблема в вашем внутреннем коде или в том, как вы взаимодействуете с DataGrid?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...