Как бороться с исключением дескриптора создания окна при добавлении пользовательского элемента управления на панель в C#?
В настоящее время у меня есть программа для отображения информации о некоторых элементах. Что у меня есть com box
использовать различные категории и одну панель для отображения элементов для выбора в com box
,
Я создал свой собственный элемент управления для отображения, но когда я динамически добавляю его на панель, это вызывает Win32 Exception
который Create Window handle Error
,
После нескольких тестирований я заметил, что после того, как на панели появилось 1800 пользовательских элементов управления, возникает исключение. Есть ли кто-нибудь, кто может решить эту проблему? Благодарю.
private void DisplayItems(List<ITEM_DATA> ItemList)
{
DisposeControls();
int total = ItemList.Count;
ItemDisplayer itemDisplayer = null;
Application.DoEvents();
for (int i = 0; i < total / 4 + 1; i++)
{
for (int j = 0; j < 4; j++)
{
int m = (i * 4) + j;
if (m >= total)
{
return;
}
itemDisplayer = new ItemDisplayer(ItemList[m], ref labItemName);
itemDisplayer.Size = new Size(240, 80);
itemDisplayer.Location = new Point(240 * j, 80 * i);
itemDisplayer.Name = "itemDisplayer" + Convert.ToString(m);
pnlItems.Controls.Add(itemDisplayer);
}
}
}
1 ответ
Просто хочу подтвердить. Потратьте некоторое время, чтобы выяснить, где произошла эта проблема. Я понял, что пользовательский объект достиг предела 10000. И я просто решил эту проблему, правильно настроив пользовательский контроль.
Я повторно реализую метод dispose в своем пользовательском классе управления.
// Flag: Has Dispose already been called?
bool disposed = false;
// Instantiate a SafeHandle instance.
SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);
// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing) {
handle.Dispose();
// Free any other managed objects here.
//
}
// Free any unmanaged objects here.
//
disposed = true;
}
В соответствии с описанием ссылки здесь