c# – 使所有datagridview列可排序

前端之家收集整理的这篇文章主要介绍了c# – 使所有datagridview列可排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带有datagridview的 Windows窗体.

理想情况:

用户点击九列中的任何一个,并且程序对所有数据进行排序,如果点击的列包含数字,我想要顶部的最低数字.如果点击的列包含一个字符串,我希望它按字母顺序排列(A-Z).

我现在有什么

我在Stack Overflow上看到一个旧问题,OP中如何在点击“a”头时对datagridview进行排序.与我的不同之处在于我希望我的datagridview可以被九列中的任何一个排序.

我有这个代码,从我发现的问题偷走了:

dataGridView2.DataSource = listPlayers.Select(s => new { voornaam = s.Voornaam,Achternaam = s.Achternaam,positie = s.Positie,Nationaltieit = s.Nationaliteit,Leeftijd = s.Age,Aanval = s.Aanval,Verdediging = s.Verdediging,Gemiddeld = s.Gemiddeld,waarde = s.TransferWaarde })
                                   .OrderBy(s => s.Achternaam)
                                   .ToList();

foreach(DataGridViewColumn column in dataGridView2.Columns)
    {
        dataGridView2.Columns[column.Name].SortMode =
                                  DataGridViewColumnSortMode.Automatic;
    }

这只允许用户在点击九列中的一个时由“Achternaam”命令.我想要的是当用户点击Nationaliteit列时,数据按照顶部的An排序.每列都是如此

这是listplayers列表:

namespace SimulatorSimulator
{
    class SpelerData
    {
        public string Voornaam { get; set; }
        public string Achternaam { get; set; }
        public string Positie { get; set; }
        public string Nationaliteit { get; set; }
        public int Age { get; set; }
        public int Aanval { get; set; }
        public int Verdediging { get; set; }
        public int Gemiddeld { get; set; }
        public string TransferWaarde { get; set; }
    }
}

在主班上:

List<SpelerData> listPlayers = new List<SpelerData>();

一些虚拟数据:

Romelu;Lukaku;Aanvaller;Belgie;22;87;12;50;41.000.000,00    
Raheem ;Sterling;Aanvaller;Engeland;21;84;30;57;35.000.000,00    
Zlatan ;Ibrahimovic;Aanvaller;Zweden;34;87;21;54;34.500.000,00

解决方法

我认为你最简单的方式是将数据放在数据库表中.这样,您可以简单地将其用作dataGridView2的数据源,您可以通过单击标题列轻松进行排序.

另一种方法是使用SortableBindingList(article)作为其他答案也建议.

但是如果这两个选项都不在您的选择之中,那么我可以想到的最简单的方法是通过从ColumnHeaderMouseClick创建事件,然后您可以通过使用e.ColumnIndex和右键“映射”(Dictionary)列表您的排序准备的IEnumerable< SpelerData>

所以,在你的形式加载,你做这样的事情:

Dictionary<int,IEnumerable<SpelerData>> queryDict = new Dictionary<int,IEnumerable<SpelerData>>(); //Prepare a dictionary of query
private void form_load(object sender,EventArgs e) {
    dataGridView2.DataSource = listPlayers.OrderBy(x => x.Achternaam).ToList();
    queryDict.Add(0,listPlayers.OrderBy(x => x.Voornaam));
    queryDict.Add(1,listPlayers.OrderBy(x => x.Achternaam));
    queryDict.Add(2,listPlayers.OrderBy(x => x.Positie));
    queryDict.Add(3,listPlayers.OrderBy(x => x.Nationaliteit));
    queryDict.Add(4,listPlayers.OrderBy(x => x.Age));
    queryDict.Add(5,listPlayers.OrderBy(x => x.Aanval));
    queryDict.Add(6,listPlayers.OrderBy(x => x.Verdediging));
    queryDict.Add(7,listPlayers.OrderBy(x => x.Gemiddeld));
    queryDict.Add(8,listPlayers.OrderBy(x => x.TransferWaarde));
}

然后在ColumnHeaderMouseClick事件中,只需执行以下操作:

private void dataGridView2_ColumnHeaderMouseClick(object sender,DataGridViewCellMouseEventArgs e) {
    dataGridView2.DataSource = queryDict[e.ColumnIndex].ToList();
}

你会得到你想要的行为.

请注意,由于IEnumerable是延迟执行,所以早期准备Dictionary将不会对性能产生影响.您唯一需要添加的是Form_Load中的9行代码,用于在dataGridView2_ColumnHeaderMouseClick事件中准备字典和1行代码.这是除了我之前提到的两个我能想到的最简单的解决方案.

猜你在找的C#相关文章