Получить выбранные DataGridViewRows в текущем порядке - PullRequest
1 голос
/ 07 декабря 2010

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

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

Ответы [ 6 ]

6 голосов
/ 20 февраля 2012

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

List<DataGridViewRow> dgList = new List<DataGridViewRow>();
foreach (DataGridViewRow r in dgv.SelectedRows)
{
    dgList.Insert(0, r);
}
foreach(DataGridViewRow r in dgList)
{
   //Print/consume your row here.
   int selectedIndex = r.Index;
}

Примечание: сортировка не требуется.

5 голосов
/ 29 ноября 2013

У меня такая же проблема.Его взгляд кратчайшим путем:

List<DataGridViewRow> rows = 
    (from DataGridViewRow row in dgv.SelectedRows 
    where !row.IsNewRow 
    orderby row.Index 
    select row).ToList<DataGridViewRow>();
2 голосов
/ 07 декабря 2010

Я не думаю, что есть один способ сделать это.Вам нужно будет переделать сортировку в свой собственный список, а затем использовать IndexOf с SelectedItems для определения визуальной позиции.

List<DataGridViewRow> l = new List<DataGridViewRow>();
foreach (DataGridViewRow r in dgv.Rows)
{
    l.Add(r);
}

l.Sort((x, y) =>
    {
        IComparable yComparable = (IComparable)x.Cells[dgv.SortedColumn.Index].Value;
        IComparable yc = (IComparable)x.Cells[dgv.SortedColumn.Index].Value;

        if (dgv.SortOrder == SortOrder.Ascending)
            return yc.CompareTo(yComparable);
        else
            return yComparable.CompareTo(yc);
    }
    );

foreach(DataGridViewRow r in dgv.SelectedRows)
{
    int selectedIndex = l.IndexOf(r);
}

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

0 голосов
/ 21 января 2019

SelectedCells, кажется, в порядке щелчка или, по крайней мере, в обратном порядке.Этот работает максимально просто:

foreach (DataGridViewRow row in dataGridLog.Rows)
{
    foreach (DataGridViewCell cell in row.Cells)
    {
        if (cell.Selected)
            sb.AppendLine($"{cell.Value.ToString()}");
    }
}
0 голосов
/ 31 января 2017

вот версия вышеуказанного кода для vb.net.

C #

List<DataGridViewRow> rows = 
    (from DataGridViewRow row in dgv.SelectedRows 
    where !row.IsNewRow 
    orderby row.Index 
    select row).ToList<DataGridViewRow>();

VB.NET

Dim rows As List(Of DataGridViewRow) = (From row As DataGridViewRow 
   In dgv.SelectedRows Where Not row.IsNewRow Order By row.Index).ToList()

Конвертеры C # в VB.NET не переводят это правильно.

Надеюсь, это поможет любому кодировщику VB.NET, желающему его использовать.

Пол

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

Вы должны иметь возможность ссылаться на значения в выбранной ячейке следующим образом:

Private Sub determinePKVals(ByRef PKVal As String, ByRef PKVal2 As String, Optional ByVal row As Integer = -1)
    If row = -1 Then        ' optional value not passed
        row = dgvDisplaySet.CurrentRow.Index
    End If

    PKVal = dgvDisplaySet.Rows(row).Cells(0).Value
    PKVal2 = dgvDisplaySet.Rows(row).Cells(1).Value
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...