Использование циклов, чтобы получить на каждый элемент в ListView? - PullRequest
5 голосов
/ 28 августа 2009

Каков хороший и эффективный способ получения каждого элемента в ListView более чем одного столбца с использованием циклов?

После того, как я немного покопался, я не смог ничего найти, поэтому когда я нашел что-то, я хотел бы поделиться этим здесь, посмотреть, есть ли у людей лучшие способы сделать это. Кроме того, что-то вроде вытеснения вопроса, который обязательно возникнет, когда я немного почесал голову, думая, как это сделать ??? эрррр .... я?

Мне нравится этот сайт, поэтому я хотел бы поделиться своим решением вопроса выше. В некотором роде, я знаю, но, тем не менее, я знаю, что это поможет кому-то где-нибудь. =)

    private ArrayList getItemsFromListViewControl()
    {                      
        ArrayList lviItemsArrayList = new ArrayList();

        foreach (ListViewItem itemRow in this.loggerlistView.Items)
        {
            //lviItemsArrayList.Add(itemRow.Text); <-- Already included in SubItems so ... = )

            for (int i = 0; i < itemRow.SubItems.Count; i++)
            {
                lviItemsArrayList.Add(itemRow.SubItems[i].Text);
                // Do something useful here, for example the line above.
            }
        }
        return lviItemsArrayList;
    }

Возвращает представление на основе линейного массива всех элементов, принадлежащих целевому элементу управления ListView в объекте коллекции ArrayList.

Ответы [ 4 ]

6 голосов
/ 28 августа 2009

Я предлагаю использовать IEnumerable в качестве типа возврата метода и использовать «yield return» для возврата каждого подпункта.

private IEnumerable<ListViewSubItem> GetItemsFromListViewControl()
{                      
    foreach (ListViewItem itemRow in this.loggerlistView.Items)
    {            
        for (int i = 0; i < itemRow.SubItems.Count; i++)
        {
            yield return itemRow.SubItems[i]);
        }
    }
}

хотя, если вы используете .NET 3.5, я предлагаю также использовать LINQ.

4 голосов
/ 28 августа 2009
    foreach (ListViewItem itemRow in this.ListView.Items)
    {            
        for (int i = 0; i < itemRow.SubItems.Count; i++)
        {
            // Do something useful here !
            // e.g 'itemRow.SubItems[count]' <-- Should give you direct access to
            // the item located at co-ordinates(0,0). Once you got it, do something 
            // with it.
        }
    }

Это мой способ сделать это.

0 голосов
/ 28 августа 2009

Если у вас есть .NET 3.5, другой и более простой способ сделать то, что вы показываете выше -

  var qry = from i in listView1.Items.Cast<ListViewItem>()
            from si in i.SubItems.Cast<System.Windows.Forms.ListViewItem.ListViewSubItem>()
            select si.Text;
0 голосов
/ 28 августа 2009

У меня нет времени, чтобы проверить это с помощью кода, но, возможно, вы могли бы инициализировать список массивов коллекцией, возвращаемой одним из методов просмотра списка? Я проверю это, когда вернусь домой, и прокомментирую, если до этого вопроса не было ответа.

РЕДАКТИРОВАТЬ: я сделал это очень быстро проверить, и он скомпилировал, запустил и инициализировал arraylist с одним элементом, который я вставил в просмотр списка.

ArrayList lviItemsArrayList = new ArrayList(loggerlistView.Items.ToList());

Сделайте попытку и дайте нам знать, если это работает ... Хотя я согласен с другим комментарием. Я полагаю, что единственной причиной для преобразования его в список массивов было то, что вы собирались сохранить его где-то, кроме веб-формы. Конечно, не для обработки списка.

РЕДАКТИРОВАТЬ # 2:

loggerlistView.Items имеет тип "System.Collections.Generic.IList" и имеет метод с именем "ToList", как описано здесь .

Попробуйте добавить ссылку на Linq? До сих пор я не осознавал, что это специфично для .NET 3.5 - извините за путаницу.

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