Подэлементы ListView не отображаются в winforms - PullRequest
0 голосов
/ 12 июня 2018

Я создаю приложение winforms в visual studio 2017, я заполняю 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 отображался как положено?

1 Ответ

0 голосов
/ 12 июня 2018

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());
}
...