Ошибка при создании дескриптора окна в ControlCollection
От: andrewr  
Дата: 13.09.10 14:56
Оценка:
Есть winform форма, из базы данных подгружается список определенных данных, на базе которых формируется что-то типа репитера на базе ControlCollection. Элемент репитера — кастомный контрол, на котором есть около 5-6 стандартных контролов (групировка, лейблы, текстбоксы, кнопки). Каждый элемент списка — соответствует такому кастомному контролу. При попытке вставить более чем определенное количество элементов (в моем случае около 900) возникает "Ошибка при создании дескриптора окна". При том, что форма при инициализации на какое то время зависает.


Exception Information
*********************************************
Exception Type: System.ComponentModel.Win32Exception
NativeErrorCode: 8
ErrorCode: -2147467259
Message: Ошибка при создании дескриптора окна.
Data: System.Collections.ListDictionaryInternal
TargetSite: Void CreateHandle(System.Windows.Forms.CreateParams)
HelpLink: NULL
Source: System.Windows.Forms

StackTrace Information
*********************************************
в System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
в System.Windows.Forms.Control.CreateHandle()
в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
в System.Windows.Forms.Control.CreateControl()
в System.Windows.Forms.Control.ControlCollection.Add(Control value)
в MD.ControlArray.AddNewButton(Int32 topPos, Int32 leftPos, Details lICFCode) в F:\Projects\MD\MD\Classes\ControlArray.cs:строка 50
в MD.FormVorschau.AddNewICFControl(Details lICFCode) в F:\Projects\MD\MD\FormVorschau.cs:строка 828
в MD.FormVorschau.FillListOfCodeControls() в F:\Projects\MD\MD\FormVorschau.cs:строка 851


####################################################################################################################



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

1. Ошибка возникает потому что не хватает памяти, или дескрипторов окна?
2. Что можно сделать для убыстрения формы, или хотя бы устранения подобной ошибки?
3. Где можно внятно почитать об особенностях ControlCollection?
Re: Ошибка при создании дескриптора окна в ControlCollection
От: Аноним  
Дата: 14.09.10 05:09
Оценка:
"Ошибка при создании дескриптора окна" — была такая проблема при использовании SourceGrid (в ней под каждую ячейку создавалось окно) — устранил путём уменьшения показываемых строк. Видимо и здесь их количество (репитеров) нужно уменьшить. Может фильтры какие-нибудь на выборку записей из БД задать.
Re: Ошибка при создании дескриптора окна в ControlCollection
От: MxMsk Португалия  
Дата: 14.09.10 07:03
Оценка:
Здравствуйте, andrewr, Вы писали:

A>Exception Information

A>*********************************************
A>Exception Type: System.ComponentModel.Win32Exception
A>NativeErrorCode: 8
Так. Если я правильно понимаю, то "NativeErrorCode: 8" — это ERROR_NOT_ENOUGH_MEMORY.

A>Сразу обмолвлюсь, что форму создавал другой человек, которого уже не найти. Ессно клиент переделывать во что-то более внятное не хочет, потому у меня есть несколько вопросов:

A>1. Ошибка возникает потому что не хватает памяти, или дескрипторов окна?
Скорее всего слишком много дескрипторов. Правда я с этим не сталкивался.

A>2. Что можно сделать для убыстрения формы, или хотя бы устранения подобной ошибки?

Виртуализовать. Пользователь же не все 900 контролов видит одновременно. Еще вариант, попробовать реализовать некоторые контролы без хэндла — просто как графический элемент (если такое возможно, конечно).

A>3. Где можно внятно почитать об особенностях ControlCollection?

Да нет там особенностей. Обычная строго-типизированная коллекция, выполняющая всякие служебные функции, типа прописывания Parent-а.
Re[2]: Ошибка при создании дескриптора окна в ControlCollect
От: andrewr  
Дата: 14.09.10 16:23
Оценка:
Здравствуйте, MxMsk, Вы писали:

MM>Здравствуйте, andrewr, Вы писали:


A>>Exception Information

A>>*********************************************
A>>Exception Type: System.ComponentModel.Win32Exception
A>>NativeErrorCode: 8
MM>Так. Если я правильно понимаю, то "NativeErrorCode: 8" — это ERROR_NOT_ENOUGH_MEMORY.

Ага. Наконец то я уверен в этой ошибке

A>>Сразу обмолвлюсь, что форму создавал другой человек, которого уже не найти. Ессно клиент переделывать во что-то более внятное не хочет, потому у меня есть несколько вопросов:

A>>1. Ошибка возникает потому что не хватает памяти, или дескрипторов окна?
MM>Скорее всего слишком много дескрипторов. Правда я с этим не сталкивался.

Ну реально на кастом контроле около 5 лейблов, которые ессно создают свой дескриптор окна. Сейчас я переубеждаю клиента в том, что нужно эти лейблы менять на овн-дравинг.

A>>2. Что можно сделать для убыстрения формы, или хотя бы устранения подобной ошибки?

MM>Виртуализовать. Пользователь же не все 900 контролов видит одновременно. Еще вариант, попробовать реализовать некоторые контролы без хэндла — просто как графический элемент (если такое возможно, конечно).

В том то и дело, что для виртуализации нужно делать оч много переделок самой формы. Она изначально была сделана без учета подобных проблем, да и раньше надо было загружать не более 10-12 элементов. Как я сказал выше, буду продавливать замену всех лишних контролов на их отрисовку. Там даже чекбокс можно на отрисованный поменять без особой внешней разницы.

В целом все ясно. Тему можно закрывать. Спасибо откликнувшимся.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.