Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
.NET 4.x

Почему ListView в виртуальном режиме выдает исключение когда окно свернуто

13.01.2012, 17:15. Показов 1304. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, из темы понятно в чем проблема.
Когда окно с листом свернуто, и я пытаюсь обновить содержимо листа, через три хода выдается исключение в позиции указанной ---1, содержимое ее вот такое"Ссылка на объект не указывает на экземпляр объекта."

Если кто сможет, помогите, заранее благодарю.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 public void RefreshListView1()//метод заполнения листа
        {
            listObjectsToCash.Clear();
            double sum = 0; //получаем сумму элементов
            foreach (double x in objForm1.massive3)//подсчет суммы для подсчета вероятности
            {
                sum += x;
            }
            int tempIncr = -1;
            foreach (string temp in objForm1.massive2)
            {
                tempIncr++;
                //есть небольшой перекос при создании объекта и его положение в листе
                var tempObjects = new LogItem(tempIncr,
                    objForm1.massive2[tempIncr].ToString(),
                    (double)objForm1.massive3[tempIncr],
                    (((double)(objForm1.massive3[tempIncr]) / sum) * 100.0),
                    objForm1.massive4[tempIncr].ToString());
                if (((objForm1.massive2[tempIncr].ToString()).ToLower().IndexOf(mask.ToLower()) != -1))//если находим элемент по маски то печатаем его
                {
 
                    listObjectsToCash.Add(tempObjects);//добавляем элемент
                }
---1----                this.listView1.VirtualListSize = listObjectsToCash.Count;//виртуальный размер равен длине логитема
            }
        }
 
        private ListViewItem LogToListItem(LogItem item)//метод для добавления объектиков в лист из 
        {
            var listItem = new ListViewItem(item.Path);
            //listItem.SubItems.Add(item.Index.ToString());
            listItem.SubItems.Add(item.Index.ToString());//присвоением листу значений из свойств созданных классов
            listItem.SubItems.Add(item.Rate.ToString());
            listItem.SubItems.Add(item.P.ToString());
            listItem.SubItems.Add(item.Was.ToString());
 
            return listItem;
        }
 
        private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
        {
            if (cache != null && e.ItemIndex >= cIdx && e.ItemIndex < cIdx + cache.Length)
            {
                // Cache hit
                e.Item = cache[e.ItemIndex - cIdx];
            }
            else
            {
                // Cache miss
                e.Item = LogToListItem(listObjectsToCash[e.ItemIndex]);
            }
        }
 
        private void listView1_CacheVirtualItems(object sender, CacheVirtualItemsEventArgs e)
        {
            int length;
            if (flag_temp_refresh_cash)
            {
                cIdx = e.StartIndex;
                length = e.EndIndex - e.StartIndex + 1;
                cache = new ListViewItem[length];//создание коротенького массива
 
                // Fill the cache
                for (int i = 0; i < length; i++)
                    cache[i] = LogToListItem(listObjectsToCash[e.StartIndex + i]);
                flag_temp_refresh_cash = false;
                return;
            }
 
            if (cache != null && e.StartIndex >= cIdx && e.EndIndex <= cIdx + cache.Length)
            {
                // No need to rebuild the cache now
                return;
            }
 
            cIdx = e.StartIndex;
            length = e.EndIndex - e.StartIndex + 1;
            cache = new ListViewItem[length];
 
            // Fill the cache
            for (int i = 0; i < length; i++)
                cache[i] = LogToListItem(listObjectsToCash[e.StartIndex + i]);
        }
Причем если окно открыто, все в порядке.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2012, 17:15
Ответы с готовыми решениями:

Как получить данные из элемента ListView, если он находится в виртуальном режиме
Здравствуйте. Перевел LIst View в виртуальный режим и все таки наткнулся я на неразришимую проблему. Раньше было вот такое событие ...

Почему когда назвал кнопку btnCtoF выдаёт ошибку а когда btn_CtoF то работает верно?
import sys from PyQt4 import QtCore, QtGui, uic form_class = uic.loadUiType(&quot;tempconv.ui&quot;) class MyWindowClass(QtGui.QMainWindow,...

Отлаживаю программу в режиме релиз, выдает ошибку: Необработанное Исключение Microsoft C++: std::bad_alloc
Отлаживаю программу в режиме релиз, выдает ошибку: Необработанное исключение в &quot;0x75cdc41f&quot; в &quot;Registratura.exe&quot;:...

3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.01.2012, 11:12
Очень странное место для вылета исключения.
Если не сложно, прицепите весь проект - попробую отдебажить.
1
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
14.01.2012, 17:32  [ТС]
Только не смейтесь, я просто решил использовать такую категорию проекта,
чтобы закреплять полученные знания.
Чтобы добиться исключения, нужно запустить, через шесть секунд она свернется, кликнуть по зеленому квадратику в трее, она развернется, нажать кнопку List, появится дочерняя форма, свернуть ее, и нажать кнопку Next, либо в программе, либо в трее.
Вложения
Тип файла: rar вар31.rar (3.66 Мб, 10 просмотров)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.01.2012, 18:56
leonidSDF, в качестве быстрого фикса вынесите нижеследующую строчку за цикл:
C#
1
this.listView1.VirtualListSize = listObjectsToCash.Count;
Тогда падать не будет.

Но все равно интересно, почему падает именно в свернутом виде.
Домой приеду - копну глубже, может очередной баг в контроле.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2012, 18:56
Помогаю со студенческими работами здесь

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

Как выловить позицию курсора, когда приложение свёрнуто?
Как выловить позицию курсора, когда приложение свёрнуто? По идее можно запустить Хук из dll. Но как конкретно из сообщений мыши...

Как узнать, свёрнуто ли окно?
Здрасте! Как можно узнать, свёрнуто ли окно? Функция IsIconic(HWND hwnd), почему-то, не работает. Свёрнуто - в смысле скрыто в...

Не удается в фоне (когда приложение свернуто) узнать гео позицию
В файле манифеста есть: ... &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt; &lt;uses-permission...

когда отрицательные - выдает ошибкуInvalid pointer operation. Почему?
Когда ввожу положительные числа, программа работает нормально, когда отрицательные - выдает ошибкуInvalid pointer operation. Почему? uses...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru