Как добавить данные из списка <List <String>> в представление списка - PullRequest
5 голосов
/ 03 ноября 2010

У меня есть List<List<String>> MyList, который содержит

    { "A1","B1","C1" }
    { "A2","B2","C2" }
    { "A3","B3","C3" }

Мне нужно добавить это в элемент управления ListView с тремя столбцами

, чтобы представление списка было похоже на

__Clm1________________Clm2________________Clm3_______________

   A1                  A2                 A2
   B1                  B2                 B3
   C1                  C2                 C3

Есть ли способ сделать это с помощью LINQ

EDIT Вот мое решение для этого:

ListViewItem[] lItem = MyList.Select(
                                          X => new ListViewItem(X.ToArray())
                                    ).ToArray();
listView1.Items.AddRange(lItem);

Но здесь мне нужночтобы добавить индекс .... Представление списка будет выглядеть как

___S.No __Clm1________________Clm2________________Clm3_______________
   1      A1                  A2                 A2
   2      B1                  B2                 B3
   3      C1                  C2                 C3

Как добавить индекс в представление списка?

Ответы [ 4 ]

4 голосов
/ 03 ноября 2010

Лично я нахожу это намного чище:

var myList = new List<List<string>>()
{
    new List<string>(){ "A1","B1","C1" },
    new List<string>(){ "A2","B2","C2" },
    new List<string>(){ "A3","B3","C3" },
};

listView.BeginUpdate();    
foreach (var row in myList)
{
    var item = new ListViewItem(listView.Items.Count.ToString());
    item.SubItems.AddRange(row);
    listView.Items.Add(item);
}
listView.EndUpdate();
3 голосов
/ 03 ноября 2010

Если вы обнаружите, что много работаете с ListView элементами управления, возможно, стоит добавить несколько простых методов расширения:

public static class ListViewExtensions
{
    public static ListView AddItems(this ListView listView,
        IEnumerable<ListViewItem> items)
    {
        listView.Items.AddRange(items.ToArray());
        return listView;
    }

    public static ListViewItem WithSubItems(this ListViewItem item,
        IEnumerable<string> subItems)
    {
        item.SubItems.AddRange(subItems.ToArray());
        return item;
    }
}

Полученный код становится очень лаконичным и понятным:

var rows = new List<List<string>>()
{
    new List<string>(){ "A1","B1","C1" },
    new List<string>(){ "A2","B2","C2" },
    new List<string>(){ "A3","B3","C3" },
};

listView1.AddItems(
    rows.Select(
        (row, index) => new ListViewItem(index.ToString())
            .WithSubItems(row)
        )
    );
3 голосов
/ 03 ноября 2010

Да .. У меня есть решение .... Вот оно

int i=1;
ListViewItem[] lItem =MyList.Select(X=> new ListViewItem(new String[]{i++.ToString()}.Concat(X).ToArray())).ToArray(); 
listView1.Items.AddRange(lItem); 
1 голос
/ 03 ноября 2010

Используйте перегрузку Select, которая принимает индекс:

var rows = new List<List<string>>()
{
    new List<string>(){ "A1","B1","C1" },
    new List<string>(){ "A2","B2","C2" },
    new List<string>(){ "A3","B3","C3" },
};

listView1.Items.AddRange(
    rows.Select(
        (row, index) => new ListViewItem(
            new[] { index.ToString() }
                .Concat(row)
                .ToArray()
            )
        )
        .ToArray()
    );

Я бы лично использовал для этого разные стили (локальные делегаты или методы расширения + свободный синтаксис), поскольку я неочень нравится вызывать ToArray inline, но это так же близко к встроенному, как вы собираетесь получить:)

Посмотрите мой другой ответ, если вас интересует метод расширения + опция беглого синтаксиса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...