我有一个包含c1 .. c4列的表,以及一个包含
等数据的行c1 c2 c3 c4
[CAN] [YOU] [说明] [ME]
多选正在开启。当我获得datagridview.SelectedCells时,它们将按照选择它们的顺序排在列表中。例如。我选择了HELP然后你的名单将是HELP,然后是你。但是我需要一个清单来显示你,帮助,因为你是在HELP之前的一个专栏。如果我按顺序选择你,帮助,CAN,那么列表应该是CAN,YOU,HELP,因为CAN在c1中,你在c2中,而HELP在c3中。
我该怎么做?谢谢你的帮助。
克里斯
嗨,这是代码。所选单元格列表的顺序取决于您选择它们的方式 - 例如从左到右,反之亦然。从代码中可以看出,我找到了一种解决方法。 OrderBy的想法更优雅,但我相信它只适用于Rows而不适用于细胞。
private void attribute_treeview_DragDrop(object sender,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();
}
}
答案 0 :(得分:1)
您可以尝试使用linq在索引上对它们进行排序
var ordered = datagridview.SelectedCells.OrderBy(c=>c.Index)
修改1:所以上面似乎不起作用。下面我创建了一个小型表单应用程序进行测试。 该应用程序包含一个带有datagridview的表单,一个按钮和一个文本框。 单击该按钮将在文本框中以正确的顺序显示所选单元。 请参阅button1_click事件以进行排序。
Forms1.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数组将允许您对索引进行排序。
答案 1 :(得分:1)
我认为这更容易/更清洁/更短。
datagridview.SelectedCells
.Cast<DataGridViewCell>()
.OrderBy(c=>c.ColumnIndex)