如何计算 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弹出菜单,那怎么获取这个子项的数据呢?