Перебрать все элементы в ListView в виртуальном режиме - PullRequest
0 голосов
/ 15 января 2009

У меня есть модуль отчетности, который создает отчеты в формате PDF из ListViews.

Теперь у меня есть ListView в виртуальном режиме, и поэтому я не могу перебрать коллекцию Items.

Как зациклить все элементы в представлении списка из модуля отчетности?

Я могу получить свойство VirtualListSize, поэтому я знаю, сколько элементов в списке. Могу ли я как-то назвать RetreiveVirtualItem явно?

Модуль отчетов не знает о нижележащем списке в ListView.

Ответы [ 4 ]

4 голосов
/ 15 января 2009

Итак, просмотр списка в виртуальном режиме - это просто визуализация вашего базового списка, верно?

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

2 голосов
/ 13 мая 2009

В виртуальном ListView вы не можете выполнить итерацию Items, но вы все равно можете получить к ним доступ по их индексу:

for (int i = 0; i <  theVirtualListView.VirtualListSize; i++) {
    this.DoSomething(theVirtualListView.Items[i]);
}
1 голос
/ 22 января 2009

Вы всегда можете открыть основной список для внешнего мира:

foreach (object o in virtListView.UnderlyingList)
{
  reportModule.DoYourThing(o);
}
1 голос
/ 15 января 2009

Лучшее решение, которое я придумал, - это иметь делегата в классе отчета, в котором передача на тот же делегат, который я установил в ListView.RetrieveVirtualItem.

class Report {
   [...]
   // Called when the content of an VirtualItem is needed.
   public event RetrieveVirtualItemEventHandler RetrieveVirtualItem;
   [...]

   private AddRows() {
      for (int i = 0; i < GetItemCount(); i++) 
         AddRow(GetItem(i));
   }

   private ListViewItem GetItem(n) {
      if (_listView.VirtualMode)
         return GetVirtualItem(n);
      return _listView.Items[n];
   }

    private ListViewItem GetVirtualItem(int n)
    {
        if (RetrieveVirtualItem == null)
            throw new InvalidOperationException(
                "Delegate RetrieveVirtualItem not set when using ListView in virtual mode");

        RetrieveVirtualItemEventArgs e = new RetrieveVirtualItemEventArgs(n);
        RetrieveVirtualItem(_listView, e);
        if (e.Item != null)
        {
            return e.Item;
        }
        throw new ArgumentOutOfRangeException("n", "Not in list");
    }

   private static int GetItemsCount()
   {
      if (_listView.VirtualMode)
          return _listView.VirtualListSize;
      return _listView.Items.Count;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...