Выбранные строки при сортировке DataGridView в приложении WinForm - PullRequest
10 голосов
/ 27 января 2011

В приложении WinForm, C # 4.0, у меня есть DataGridView, связанный с SortableBindingList.Следовательно, его можно отсортировать, щелкнув по столбцу заголовка - пока все в порядке; -)

Проблема в том, что выбранные строки кажутся «запомненными» по номеру строки.Вот что происходит:

A*  <- "Selected"
B
C

Теперь сортировка по убыванию, C сверху и выделено.Я бы хотел выбрать еще A:

C*  <- "Selected"
B
A   <- "Want have"

То же самое происходит с несколькими выбранными строками.Есть ли обходной путь для этого?

Ответы [ 2 ]

11 голосов
/ 10 апреля 2011

Вы можете обойти это поведение, сохранив значение текущей выбранной строки (или строк) перед сортировкой, а затем повторно выбрав строку впоследствии.

Вам необходимо использовать событие CellMouseDown - необходимоиспользуйте это событие, так как оно срабатывает до того, как произойдет сортировка.Альтернативные события, такие как ColumnHeaderMouseClick, слишком поздние.

В обработчике событий CellMouseDown проверьте, что индекс строки равен -1, чтобы убедиться, что заголовки были выбраны.

void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.RowIndex == -1)
    {
        selected = dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
    }
}

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

Затем в обработчике событий Sorted DataGridView вы можете использовать метод .Find ()источник привязки сетки:

void dataGridView1_Sorted(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(selected))
    {
        int itemFound = _bindingSource.Find("name", selected);
        _bindingSource.Position = itemFound;
    }
}

Во время исследования я обнаружил следующую запись на форумах MSDN, где в ответе используется событие DataBindingComplete - я не на 100%, почему они сочли это необходимымтак как мой подход работал для всех моих тестов, но вы можете найти его полезным справочным материалом.

4 голосов
/ 12 октября 2014

Вот мой подход в VB.NET

Private cSelectedRow As String

Private Sub DataGridView1_CellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
    If e.RowIndex = -1 AndAlso DataGridView1.SelectedRows.Count > 0 Then
        cSelectedRow = DataGridView1.SelectedRows(0).Cells("ID").Value.ToString()
    End If
End Sub

Я использовал те же события, что и Дэвид Холл, но не использовал BindingSource.Поэтому я перебираю все Линии сетки, чтобы найти ту, которая была выбрана ранее.

Private Sub DataGridView1_Sorted() Handles DataGridView1.Sorted
    DataGridView1.ClearSelection()
    For Each xRow As DataGridViewRow In DataGridView1.Rows
        If xRow.Cells("ID").Value = cSelectedRow Then
            DataGridView1.CurrentCell = xRow.Cells(0)
            'Line Found. No need to loop through the rest.
            Exit For
        End If
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...