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行代码.这是除了我之前提到的两个我能想到的最简单的解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |