【问题标题】:SubItems of ListView are not displayed in winformsListView的子项在winforms中不显示
【发布时间】:2018-06-12 14:35:29
【问题描述】:

我正在 Visual Studio 2017 中创建一个 winforms 应用程序,我正在使用一个

 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

    • 123
    • 456
    • 789
  • 防御

    • 123
    • 233

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 按预期显示?

【问题讨论】:

  • 看起来像 TreeView。
  • @LarsTech 这不可能吗?
  • 不确定您为什么使用 ListView。无论哪种方式,这都是一个调试问题。在您的代码上放置一个调试停止并运行它,当它停止时,逐行遍历代码以查看发生了什么并检查值。您将看到为什么您的子项从未被添加。
  • @LarsTech 我实际上已经调试了代码,它添加了 SubItems,但它从未在 ListView 中显示它们。
  • 还要确保您使用的是详细信息视图并且您有一些列。

标签: c# winforms listview subitem


【解决方案1】:

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}");

注意

在 cmets 中也提到,可能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());
}

【讨论】:

  • 我觉得值得一提的是ListView其实可以对它的Items进行分组。
  • 是的,这取决于 OP/未来的读者来发现更多关于 ListView 组的信息。
  • @RezaAghaei 是否可以显示没有加号或减号的树节点?只是带有节点的树节点?是否可以只选择树的标题?
  • @OmarAlMadani 是的,您可以将ShowPlusMinus 设置为false。但用户仍然可以通过双击或键盘折叠或展开。如果要防止折叠和展开,则需要处理相应的事件。
猜你喜欢
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多