Как выделить поиск в DataGrid быстрее в wpf? - PullRequest
0 голосов
/ 24 марта 2019

Я выполняю поиск в сетке данных через текстовое поле, и мой код выделяет искомый текст в ячейках сетки данных и фильтрует строки в соответствии с поиском. Это отлично работает для небольшого числа строк, но при увеличении строки становится очень медленным.кто-то может предложить что-нибудь, чтобы сделать его более эффективным, я был бы благодарен:)

Для выделения текста поиска в ячейках сетки данных

public void HighlightSearch()
        {
             if (string.IsNullOrEmpty(SearchText))
            {
                if ((dataGrid.ItemsSource as DataView).RowFilter == "")
                    return;
            }
            string searchtext = SearchText;
            Regex SearchRegex = new Regex(searchtext, RegexOptions.IgnoreCase);
            if (dataGrid.ItemsSource != null)
            {
                for (int i = 0; i < dataGrid.Columns.Count; i++)
                {
                    var checkbox = SearchColumns[i];
                    if (checkbox.IsChecked == true)
                    {
                        for (int j = 0; j < dataGrid.Items.Count; j++)
                        {
                            DataGridCell cell = GetCell(j, i);
                            string[] substrings =null;
                            if (cell.Content is TextBlock itx)
                            {
                                Regex regex = new Regex("(" + SearchText + ")", RegexOptions.IgnoreCase);
                                TextBlock tb = itx as TextBlock;
                                if (SearchText.Length == 0)
                                {
                                    string str = tb.Text;
                                    tb.Inlines.Clear();
                                    tb.Inlines.Add(str);
                                }
                                else
                                {
                                    substrings = regex.Split(tb.Text);
                                    tb.Inlines.Clear();
                                    foreach (var item in substrings)
                                    {
                                        if (regex.Match(item).Success)
                                        {
                                            Run runx = new Run(item);
                                            runx.Background = Brushes.Blue;
                                            tb.Inlines.Add(runx);
                                        }
                                        else
                                        {
                                            tb.Inlines.Add(item);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

Для фильтрации строк

private void FilterGrid()
        {
            if (dataGrid.ItemsSource != null)
            {
                string query = "";
                foreach (CheckBox checkbox in SearchColumns)
                {
                    if (checkbox.IsChecked == true)
                    {
                        // to check if its the first columns and form the appropriate filter query ;)
                        if (query == "")
                            query = $"Convert([{checkbox.Content}], System.String) LIKE '%{SearchText}%'";
                        else
                            query += $" or Convert([{checkbox.Content}], System.String) LIKE '%{SearchText}%'";
                    }
                }
                (dataGrid.ItemsSource as DataView).RowFilter = query;
            }

        }

Чтобы получить каждую ячейку таблицы данных, я перешел по этой ссылке https://social.msdn.microsoft.com/Forums/vstudio/en-US/9a1872d9-a50b-4bf3-81fc-db0ac4a26d1c/search-in-a-datagridlistview-and-highlight-text?forum=wpf


        public DataGridCell GetCell(int row, int column)
        {
            DataGridRow rowContainer = GetRow(row);

            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                if (cell == null)
                {
                    dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                    cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                }
                return cell;
            }
            return null;
        }

        public DataGridRow GetRow(int index)
        {
            DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index);
            if (row == null)
            {
                dataGrid.UpdateLayout();
                dataGrid.ScrollIntoView(dataGrid.Items[index]);
                row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(index);
            }
            return row;
        }


        public static T GetVisualChild<T>(Visual parent) where T : Visual
        {
            T child = default(T);
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                child = v as T;
                if (child == null)
                {
                    child = GetVisualChild<T>(v);
                }
                if (child != null)
                {
                    break;
                }
            }
            return child;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...