ListView的子项在winforms中不显示

SubItems of ListView are not displayed in winforms

我正在 visual studio 2017 年创建一个 winforms 应用程序,我正在使用

填充一个 ListView
 List<KeyValuePair<string, string>>

数据示例为:

 List<KeyValuePair<ABC, 123>>
 List<KeyValuePair<ABC, 456>>
 List<KeyValuePair<ABC, 789>>
 List<KeyValuePair<DEF, 123>>
 List<KeyValuePair<DEF, 233>>

我尝试在 ListView 中显示它,我想要这样的东西:

其中 ABC 和 DEF 只能选择。我尝试写一个代码来做到这一点,但不幸的是它只显示 ABC 和 DEF 而没有子项。

我写的代码是:

         workOrderClusters = GetItac.FilterWorkOrderClusters();
        // GetItac.FilterWorkOrderClusters() is a  
        List<KeyValuePair<string,string>>
        string current; string previous,
        foreach (var workOrderCluster in workOrderClusters)
        {
            current = workOrderCluster.Key;
            if (current != previous)
            {
                var listViewItem = new ListViewItem(workOrderCluster.Key);
                foreach (var cluster in workOrderClusters)
                {
                    if (cluster.Key == current)
                    {
                        listViewItem.SubItems.Add(cluster.Value);
                    }
                }
            }
            previous = current;
            listView1.Items.Add(listViewItem);

我的问题是,有没有办法让 ListView 按预期显示?

ListView 显示子项目,如果它在 Details 视图中并且它有一些列。

假设您有以下数据:

var list = new List<KeyValuePair<string, int>>(){
    new KeyValuePair<string, int>("ABC", 123),
    new KeyValuePair<string, int>("ABC", 456),
    new KeyValuePair<string, int>("ABC", 789),
    new KeyValuePair<string, int>("DEF", 123),
    new KeyValuePair<string, int>("DEF", 233),
};

要将您的数据结构转换为 ListView 项,您可以先根据键对数据进行分组:

var data = list.GroupBy(x => x.Key).Select(x => new
    {
        Key = x.Key,
        Values = x.Select(a => a.Value)
    });

然后在控件中添加项和子项:

foreach(var d in data)
{
    var item = listView1.Items.Add(d.Key);
    foreach (var v in d.Values)
        item.SubItems.Add(v.ToString());
}

然后设置 ListView 向他们展示:

listView1.View = View.Details;
var count = data.Max(x => x.Values.Count());
for (int i = 0; i <= count; i++)
    listView1.Columns.Add($"Column {i+1}");

备注

评论里也提到了,大概TreeView更适合展示这样的数据。如果您想将该数据添加到 TreeView,在对数据进行分组后,您可以使用以下代码:

foreach (var d in data)
{
    var node = treeView1.Nodes.Add(d.Key);
    foreach (var v in d.Values)
        node.Nodes.Add(v.ToString());
}