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
- 123
- 456
- 789
DEF
- 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 按预期显示?
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());
}
我正在 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
- 123
- 456
- 789
DEF
- 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 按预期显示?
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());
}