簡體   English   中英

在Winform中的Datagridview中自定義排序

[英]Custom Sort in datagridview in winform

我的數據表有像這樣的行

ID Name
2  A
4  B
3  C
5  D
1  E

List order = new List() { "1", "3", "2", "5", "4" }

--------------按列表排序-----------------

ID Name
1   E
3   C
2   A
5   D
4   B 

任何人都可以幫助實現這一目標。.我在Winforms中使用DataTable。

對已經給出的解決方案的另一種解決方案是循環您的訂單列表,然后對源列表進行排序。

// source list
List<Foo> lSource = new List<Foo>() {
    new Foo() { ID = 2, Name = "A" },
    new Foo() { ID = 4, Name = "B" },
    new Foo() { ID = 3, Name = "C" },
    new Foo() { ID = 5, Name = "D" },
    new Foo() { ID = 1, Name = "E" },
};

// order list
List<int> order = new List<int>() { 1, 3, 2, 5, 4 };

// loop order list and sort source list
order.ForEach(x =>
{
    lSource = lSource.OrderBy(g => g.ID == x).ToList();
});

// set datasource
dataGridView1.DataSource = lSource;

我剛剛添加了一個包含int ID和一個string Name Foo類,因為您沒有共享整個代碼。

我認為您可以使用AsEnumerable方法order和數據表join起來on部分地可以使它們相等並選擇行,然后可以使用CopyToDataTable方法查詢生成DataTable

var dt = new DataTable();
var dc = new DataColumn() { ColumnName = "ID", DataType = typeof(string) };
dt.Columns.Add(dc);
dc = new DataColumn() { ColumnName = "Name", DataType = typeof(string) };
dt.Columns.Add(dc);
dt.Rows.Add(new object[] { "2", "A" });
dt.Rows.Add(new object[] { "4", "B" });
dt.Rows.Add(new object[] { "3", "C" });
dt.Rows.Add(new object[] { "5", "D" });
dt.Rows.Add(new object[] { "1", "E" });

List<string> order = new List<string>() { "1", "3", "2", "5", "4" };

var query = from item in order
            join row in dt.AsEnumerable() on item equals row.Field<string>("ID")
            select row;

var result = query.CopyToDataTable();

結果將是:

在此處輸入圖片說明

我不確定這是否是最好的方法,但這似乎與您的情況相符。

您可以加入兩個列表(一個包含項目,另一個包含排序的ID),然后選擇以下項目:

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var list = new List<Item>{
            new Item { Id = 2, Text = "A" },
            new Item { Id = 4, Text = "B" },
            new Item { Id = 3, Text = "C" },
            new Item { Id = 5, Text = "D" },
            new Item { Id = 1, Text = "E" }
        };
        var sortorder = new List<int> { 1, 3, 2, 5, 4 };

        var sortedlist = sortorder.Join(list, x => x, y => y.Id, (x,y) => y);

        foreach(var item in sortedlist) 
            Console.WriteLine("{0} {1}", item.Id, item.Text);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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