Запрет сортировки DataGridView с привязкой к данным при редактировании - PullRequest
4 голосов
/ 10 ноября 2011

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

Это очень дезориентирует пользователей и делает невозможным редактирование групп строк вместе.

Решение, которое я ищу, эффективно отключит автоматическую повторную сортировку после начальной сортировки, а затем только повторную сортировкукогда пользователь запрашивает это.

Ответы [ 4 ]

7 голосов
/ 11 ноября 2011

Для блага других, вот решение, которое я придумала, но я бы хотела услышать лучшее.

Я добавил дополнительный непостоянный столбец в таблицу данных с именем SORT_ORDER, который используется только для сортировки.

Когда пользователь щелкает столбец для сортировки, я копирую значения и тип значения из выбранного столбца в столбец SORT_ORDER, а затем сортирую по SORT_ORDER. Поскольку SORT_ORDER не отображается и не может быть отредактирован, порядок сортировки не изменяется, даже если пользователь редактирует выбранный столбец. Обработчик события выглядит так:

    private void MyDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
        dirtyCellListenerEnabled = false;

        SORT_ORDER.ValueType = MyDataGridView.Columns[e.ColumnIndex].ValueType;

        foreach(DataGridViewRow r in MyDataGridView.Rows) {
            r.Cells[SORT_ORDER.Index].Value = r.Cells[e.ColumnIndex].Value;
        }

        switch(MyDataGridView.SortOrder) {
            case System.Windows.Forms.SortOrder.None:
                MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending);
                break;
            case System.Windows.Forms.SortOrder.Ascending:
                MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Descending);
                break;
            case System.Windows.Forms.SortOrder.Descending:
                MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending);
                break;
        }
        dirtyCellListenerEnabled = true;
    }

Обратите внимание, что мне пришлось отключить и снова включить прослушиватель ячеек, чтобы мой код не воспринимал обновление столбца сортировки как реальное изменение.

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

Я уверен, что есть и другие настройки, такие как приостановка обновлений при заполнении SORT_ORDER и отображение символа сортировки в выбранном столбце.

1 голос
/ 05 марта 2013

Это настоящая боль, как я узнаю прямо сейчас. Сетки жестоко сложны, порой, казалось бы, ничего

для каждой выбранной ячейки я сохраняю первичный ключ и имя столбца сетки (я создал крошечный класс для них).

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

       Cell.Value = ValueToWrite
       Cell = FindCell(Cell.OwningRow.DataGridView, DataRow, ColName)

Function FindCell(Grid As DataGridView, DataRow As DataRow, ColName As String) As DataGridViewCell
    'Find the same cell, wherever you may be now, damn you sort.
    Dim GridRow = (From x As DataGridViewRow In Grid.Rows Where x.DataBoundItem.row Is DataRow).FirstOrDefault
    Dim Cell = GridRow.Cells(ColName)
    Return Cell
End Function
0 голосов
/ 27 августа 2017

Я столкнулся с этой проблемой и не смог получить достойный ответ, поэтому я попробовал это, и это сработало,

    private void SortBoundDG()
    {
        DataTable TempTable;
        TempTable = (DataTable)DG.DataSource;
        TempTable.DefaultView.Sort =  ColumnName + " " + "DESC";
        DG.DataSource = TempTable.DefaultView.ToTable();
    }

просто преобразуйте представление по умолчанию обратно в таблицу и установите его в качестве источника для вашего представления данных

0 голосов
/ 10 ноября 2011

Похоже, ваш GridView снова связывает данные.Это означает, что ваш порядок сортировки будет потерян.Включите Viewstate своего gridview и убедитесь, что вы не привязываете сетку при обратной передаче.

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