如何获取Datagridview按列排序的选定单元格

本文关键字:排序 单元格 Datagridview 何获取 获取 | 更新日期: 2023-09-27 18:28:54

我有一个列为c1的表。。c4和包含数据(如)的行

c1 c2 c3 c4

[可以][你][帮助][我]

Multiselect已打开。当我获取数据网格视图时。SelectedCells,则它们将按选定时间的顺序出现在列表中。例如,我选择"帮助",然后选择"你",列表将是"帮助"然后是"你"。然而,我需要一个列表来显示你,救命,因为你来自救命之前的一列。如果我按顺序选择YOU,HELP,CAN,那么列表应该是CAN,YOU,HELP,因为CAN在c1,YOU在c2,HELP在c3。

我该怎么做?谢谢你的帮助。

Chris

嗨,这是密码。所选单元格列表的顺序取决于您选择它们的方式,例如从左到右,反之亦然。正如您从代码中看到的,我找到了一个变通方法。OrderBy的想法要优雅得多,但我相信它只适用于行,而不适用于单元格。

private void attribute_treeview_DragDrop(对象发送方,DragEventArgs e){//将数据网格视图中的项目拖放到树视图中

        if (e.Data.GetDataPresent(typeof(List<string>)))
        {
            // Determine which category the item was draged to
            Point p = attribute_treeview.PointToClient(new Point(e.X, e.Y));
            TreeNode destinationNode = attribute_treeview.GetNodeAt(p);
            // sort selected cells based on position in productname
            var selected_cells = e.Data.GetData(typeof(List<string>)) as List<string>;
            SortedDictionary<int, string> orderedcellcontents = new SortedDictionary<int, string>();
            ProductItem pitem = new ProductItem((BsonDocument)productlist.SelectedItems[0].Tag);
            foreach (var element in selected_cells)
            {
                int pos = Array.IndexOf(pitem.tokens, element);
                if (!orderedcellcontents.ContainsKey(pos))
                    orderedcellcontents.Add(pos, element);
            }
            if (PopulateTreeview(destinationNode, orderedcellcontents.Values.ToList<string>())) 
            {
                dictionary_haschanged = true;
                destinationNode.Expand();
            }
        }

如何获取Datagridview按列排序的选定单元格

我认为这更容易/更干净/更短。

datagridview.SelectedCells
    .Cast<DataGridViewCell>()
    .OrderBy(c=>c.ColumnIndex)

您可以尝试使用linq在索引上对它们进行排序

var ordered = datagridview.SelectedCells.OrderBy(c=>c.Index)

编辑1:所以以上内容似乎不起作用。下面我创建了一个小表单应用程序进行测试。该应用程序由一个带有数据网格视图的表单、一个按钮和一个文本框组成。单击该按钮将在文本框中按正确顺序显示所选单元格。有关排序,请参见button_click事件。

表格1.cs

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        var data = new List<Data>();
        data.Add(new Data { A = "CAN", B = "YOU", C = "HELP", D = "ME" });
        data.Add(new Data { A = "CAN", B = "YOU", C = "HELP", D = "ME" });
        data.Add(new Data { A = "CAN", B = "YOU", C = "HELP", D = "ME" });
        data.Add(new Data { A = "CAN", B = "YOU", C = "HELP", D = "ME" });
        dataGridView1.DataSource = data;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        var selectedCells = dataGridView1.SelectedCells;
        var array = new DataGridViewCell[selectedCells.Count];
        selectedCells.CopyTo(array,0);
        var sorted = array.OrderBy(c => c.ColumnIndex);
        var s = string.Join(Environment.NewLine, sorted.Select(c => c.Value));
        textBox1.Text = s;
    }
}
public class Data
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }
    public string D { get; set; }
}

将单元格复制到DataGridViewCell数组将允许您根据索引对其进行排序。