如何计算 ListView 中的子项?

Posted

技术标签:

【中文标题】如何计算 ListView 中的子项?【英文标题】:How to count the SubItems in a ListView? 【发布时间】:2021-03-30 09:14:15 【问题描述】:

我在 ListView 中有不同的条目。我想计算条目(从第二列开始)。输出应该在“Total”列下(见下图,红框) 如何实现?使用此代码,我只能访问各个行:

for (int j = 1; j < listView1.Items[1].SubItems.Count; j++)               

   string s = listView1.Items[1].SubItems[j].Text;                   



非常感谢您的帮助!

【问题讨论】:

嗨,迈克,欢迎您,当您说“(从第二列开始)”时,您是指从上下文中看起来的第二行吗?并且您想要列表视图中所有值的总和或总列值的计数? 感谢您指出“弗兰肯斯汀·乔”。你说的对。我想计算总列值。例如,第一行中有 3 个条目(A、B、C)。条目数为 3。或第二行 (P,B) 中的 2 个条目。条目数为 2,依此类推。 我想计算条目数 现有的子项目还是填充的?装满什么?注意 LC.Items 是一个锯齿状数组! 非常聪明的问题“TaW”。我在运行时收到条目。正如你所指出的,原则上是填充的。所有条目都是字符串。有时第一行有两个条目或没有。有时第三行有三个条目,依此类推。 【参考方案1】:

这是你的解决方案

    //iterate through all rows                      
    for (int i = 0; i < listView1.Items.Count; i++)
    
        //make sure that 5 subitems are present
        int missingSubitemsCount = 5 - listView1.Items[i].SubItems.Count;
        for (int j = 0; j < missingSubitemsCount; j++)
            listView1.Items[i].SubItems.Add(new ListViewItem.ListViewSubItem());

        int count = 0;

        //test columns 1-3
        for (int j = 1; j < listView1.Items[i].SubItems.Count - 1; j++)
        
            //check if empty
            if (String.IsNullOrEmpty(listView1.Items[i].SubItems[j].Text) == false)
                count++;                    
                        
            
        //update last column
        listView1.Items[i].SubItems[4].Text = count.ToString();
      

但是,我认为改用 DataGridView 和数据绑定会更好。当项目变得更大时,直接在控件上操作可能会导致问题。将数据与视图分开会更好

这是我将如何使用 DataGridView 来实现的

    class MyItem
    
        public string Name  get; set; 
        public string Property1  get; set; 
        public string Property2  get; set; 
        public string Property3  get; set; 
        public int Total  get; set; 
    

    private void button2_Click(object sender, EventArgs e)
    
        var items = new List<MyItem>();

        items.Add(new MyItem
        
            Name = "Books",
            Property1 = "A",
            Property2 = "B",
            Property3 = "C"
        );

        items.Add(new MyItem
        
            Name = "Pencils",
            Property1 = "A",
            Property2 = "B",                
        );

        items.Add(new MyItem
        
            Name = "Tapes",
            Property1 = "A",                
        );
       
        //iterate through all items
        foreach (var item in items)
        
            //get list of MyItem properties starting with "Property"
            foreach (var property in typeof(MyItem).GetProperties().Where(u => u.Name.StartsWith("Property")))
            
                //test if null or empty, increment Total if not
                if (property.GetValue(item) != null && String.IsNullOrEmpty(property.GetValue(item).ToString()) == false)
                    item.Total++;                    
            

            //Alternative: Same calculation in one line
            item.Total = typeof(MyItem).GetProperties().Count(u => u.Name.StartsWith("Property") && u.GetValue(item) != null && String.IsNullOrEmpty(u.GetValue(item).ToString()) == false);
        

        //bind items to DataGridView
        dataGridView1.DataSource = items;            
    

【讨论】:

谢谢,我很感激。不幸的是,我收到一条错误消息(OutofRange Exception)。这仅涉及代码中的最后一行:„ listView1.Items[i]。 SubItems[4].Text = count.ToString()“。请查看我给 TaW 先生的相应笔记。 是的,这正是我告诉你的控制而不是数据模型的问题。您不需要所有子项(我假设用户填写 ListView?)。因此尝试编写 Subitems[4] 会引发异常,因为您只有 3 个甚至更少。我已经编辑了我的原始答案,检查了子项计数,如果需要,我们会添加新的 非常感谢您的努力!!这是真的,一切都恢复正常了!非常感谢拉法尔 W !! 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是对好的问题和有用的答案进行投票,accepting 是对您提出的任何问题的最有帮助的答案。

以上是关于如何计算 ListView 中的子项?的主要内容,如果未能解决你的问题,请参考以下文章

在android中,当我按了listview中的一个子项时,利用ContextMenu弹出菜单,那怎么获取这个子项的数据呢?

平铺视图中的c ++虚拟ListView,无法显示子项

更新 ListView 中的特定项目

关于理解布局单位

WPF 中的 ListView 子项

如何在小部件测试中找到屏幕外的 ListView 子项?