以当前显示的顺序获取选定的DataGridViewRows

xsl*_*xsl 1 c# datagridview winforms

我有一个DataGridView包含三个不同的未绑定数据DataColumns.行可以按每列进行排序,但除此之外不允许对显示的数据进行操作.

当我查询SelectedRows属性时,行按照我最初插入它们的顺序排序,而不是像我在当前显示或选择的顺序中所期望的那样.有没有办法改变这种行为?

mas*_*2k1 6

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;
}
Run Code Online (Sandbox Code Playgroud)

注意:无需排序。


esc*_*esc 5

我有同样的问题.它看起来最短的方式:

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


Gre*_*som 2

我认为没有一种单行方法可以做到这一点。您需要将排序重新排序到您自己的列表中,然后将 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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,上述内容尚未经过编译测试,可能需要一些调整。