Форум программистов, компьютерный форум, киберфорум
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. Показов 1289. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru