gpt4 book ai didi

c# - 使所有 datagridview 列可排序

转载 作者:太空狗 更新时间:2023-10-29 17:45:50 24 4
gpt4 key购买 nike

我有一个带有 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 排在最前面。每列依此类推

这是列表播放器列表:

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

最佳答案

我确实认为对你的情况最简单的方法是将你的数据放在 Database 中。 table 。这样,您可以简单地将其用作 data source为你的 dataGridView2 ,您将能够通过单击标题栏轻松地进行排序。

另一种方法是使用 SortableBindingList (article)正如其他答案所建议的那样。

但如果这两个选项都不在您的选择范围内,我能想到的下一个最简单的方法是从 ColumnHeaderMouseClick 创建事件,然后您可以使用 e.ColumnIndex 相应地列出您的排序和正确的“映射”(字典)到你准备好的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# - 使所有 datagridview 列可排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34945032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com