簡體   English   中英

以當前顯示的順序獲取選定的DataGridViewRows

[英]Get selected DataGridViewRows in currently displayed order

我有一個DataGridView其中的未綁定數據包含三個不同的DataColumns 可以按每一列對行進行排序,但除此之外,不允許對顯示的數據進行任何操作。

當我查詢SelectedRows屬性時,將按照最初插入它們的順序對行進行排序,而不是按照當前顯示或選定的順序進行排序。 有沒有辦法改變這種行為?

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;
}

注意:無需排序。

我有同樣的問題。 它看起來是最短的方法:

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

我認為沒有一種方法可以做到這一點。 您將需要將排序重做到自己的列表中,然后將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);
}

請注意,以上內容尚未經過編譯測試,可能需要進行一些調整。

這是上述代碼的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編碼器有所幫助。

保羅

您應該可以像這樣引用所選單元格中的值:

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

SelectedCells似乎是單擊順序或至少是反向順序。 這一工作盡可能簡單:

foreach (DataGridViewRow row in dataGridLog.Rows)
{
    foreach (DataGridViewCell cell in row.Cells)
    {
        if (cell.Selected)
            sb.AppendLine($"{cell.Value.ToString()}");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM