![](/img/trans.png)
[英]C# DataGridView get values from another column if cells is selected
[英]how to get Datagridview selected cells in ordered by their column
我有一個表,表的列為c1 .. c4,行包含諸如
c1 c2 c3 c4
[你能幫助我嗎]
多選功能已啟用。 當我獲得datagridview.SelectedCells時,它們將按選擇時的順序出現在列表中。 例如,我選擇“幫助”,然后選擇“您”,列表將是“幫助”,然后是“您”。 但是,我需要一個列表來顯示YOU,HELP,因為YOU來自HELP之前的一列。 如果我按該順序選擇YOU,HELP,CAN,則列表應為CAN,YOU,HELP,因為CAN在c1中,c2中是YOU,而c3中是HELP。
我怎樣才能做到這一點? 謝謝您的幫助。
克里斯
嗨,這是代碼。 所選單元格列表的順序取決於您如何選擇它們-例如,從左到右開始,反之亦然。 從代碼中可以看到,我找到了一種解決方法。 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();
}
}
您可以嘗試使用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數組將使您可以對索引進行排序。
我認為這更容易/更清潔/更短。
datagridview.SelectedCells
.Cast<DataGridViewCell>()
.OrderBy(c=>c.ColumnIndex)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.