簡體   English   中英

如何獲取Datagridview選定的單元格按其列排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM