我有一个带有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行代码.这是除了我之前提到的两个我能想到的最简单的解决方案.