Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使Datagridview中选定的单元格按列排序_C#_.net_Datagridview - Fatal编程技术网

C# 如何使Datagridview中选定的单元格按列排序

C# 如何使Datagridview中选定的单元格按列排序,c#,.net,datagridview,C#,.net,Datagridview,我有一张c1列的表格。。c4和包含以下数据的行 c1 c2 c3 c4 [可以][你][帮助][我] Multiselect已启用。当我获得datagridview.SelectedCells时,它们将按照被选择的时间顺序出现在列表中。例如,我选择“帮助”,然后您将看到“帮助”列表,随后是您。但是我需要一个列表来向您显示“帮助”,因为您来自“帮助”之前的一列。如果我按照这个顺序选择你,HELP,CAN,那么列表应该是CAN,YOU,HELP,因为CAN在c1,YOU在c2,HELP在c3 我该怎

我有一张c1列的表格。。c4和包含以下数据的行

c1 c2 c3 c4

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

Multiselect已启用。当我获得datagridview.SelectedCells时,它们将按照被选择的时间顺序出现在列表中。例如,我选择“帮助”,然后您将看到“帮助”列表,随后是您。但是我需要一个列表来向您显示“帮助”,因为您来自“帮助”之前的一列。如果我按照这个顺序选择你,HELP,CAN,那么列表应该是CAN,YOU,HELP,因为CAN在c1,YOU在c2,HELP在c3

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

克里斯


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

私有void属性_treeview_DragDrop(对象发送方,DragEventArgs e) { //已将项从datagridview中的任意一个拖放到treeview中

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

        }
if(例如Data.GetDataPresent(typeof(List)))
{
//确定项目拖至的类别
点p=属性_treeview.PointToClient(新点(e.X,e.Y));
TreeNode destinationNode=attribute_treeview.GetNodeAt(p);
//根据productname中的位置对选定单元格进行排序
var选择_cells=e.Data.GetData(typeof(List))作为列表;
SortedDictionary orderedcellcontents=新的SortedDictionary();
ProductItem pitem=新的ProductItem((BsonDocument)productlist.SelectedItems[0]。标记);
foreach(所选单元格中的var元素)
{
int pos=Array.IndexOf(pitem.tokens,元素);
如果(!orderedcellcontents.ContainsKey(pos))
orderedcellcontents.Add(pos,元素);
}
if(PopulateTreeview(destinationNode,orderedcellcontents.Values.ToList())
{
dictionary_haschanged=true;
destinationNode.Expand();
}
}

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

var ordered = datagridview.SelectedCells.OrderBy(c=>c.Index)
编辑1:因此上述内容似乎不起作用。下面我创建了一个小表单应用程序进行测试。 该应用程序由一个带有datagridview的表单、一个按钮和一个文本框组成。 单击按钮将在文本框中以正确的顺序显示所选单元格。 有关排序,请参阅button1\u 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; }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
var data=新列表();
添加(新数据{A=“CAN”,B=“YOU”,C=“HELP”,D=“ME”});
添加(新数据{A=“CAN”,B=“YOU”,C=“HELP”,D=“ME”});
添加(新数据{A=“CAN”,B=“YOU”,C=“HELP”,D=“ME”});
添加(新数据{A=“CAN”,B=“YOU”,C=“HELP”,D=“ME”});
dataGridView1.DataSource=数据;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
var selectedCells=dataGridView1.selectedCells;
var array=newdatagridviewcell[selectedCells.Count];
selectedCells.CopyTo(数组,0);
var sorted=array.OrderBy(c=>c.ColumnIndex);
var s=string.Join(Environment.NewLine,sorted.Select(c=>c.Value));
textBox1.Text=s;
}
}
公共类数据
{
公共字符串A{get;set;}
公共字符串B{get;set;}
公共字符串C{get;set;}
公共字符串D{get;set;}
}

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

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

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

尝试了这一点,但我得到一个编译错误:“DataGridViewSelectedCellCollection不包含OrderBy的定义,并且没有扩展方法OrderBy接受DataGridViewSelectedCellCollection类型的第一个参数”建议缺少using指令或程序集引用。我确实定义了using System.Linq;我缺少什么?您能发布一些代码来说明问题吗?它确实会导致编译错误,但我尝试只执行datagridview.SelectedCells,这会按照单元格在屏幕上的显示顺序返回单元格列表,不是按照选择的顺序。您好,这是代码。所选单元格列表的顺序取决于您选择它们的方式-例如,从左到右或从左到右。从代码中可以看出,我找到了一个解决方法。您的OrderBy想法更优雅,但我相信它只适用于行而不适用于单元格。因此,您发布的代码对其进行了排序按照正确的顺序?如果是这样,你能在代码不起作用的时候发布代码吗?我很好奇为什么在我的测试中,我会按照它们出现的顺序获取所选单元格,而不是按照你所说的顺序获取所选单元格。实际上没有不同的代码。我可以在“所选单元格”(datagridview中的原始数据)中看到什么如果我有一行有a,B,C,如果我从左到右选择,那么我将得到一个列表C,B,a。如果我从右到左选择,我将得到a,B,C。你能看到相同的吗?我的解决方法可以很好地工作,只要单元格值都不同。如果其中一个是重复的,那么它将不会添加到已排序的字典中,并且我会释放该值。我我需要解决这个问题,这样,如果我有A,B,C,A,我就不会得到A,B,C,但不管怎样,我都会得到A,B,C,A。有什么想法吗?与其只发布一行代码,你能不能解释一下这个代码的作用,它应该放在哪里,为什么它能解决这个问题?这是DieterC在接受的答案中最初建议的,但后来他发现它不起作用,因为他丢失了一个cast,然后他复制了数组,这是对原始问题“如何按colu顺序获取Datagridview选定单元格”的直接回答