Я пытаюсь принудительно создать CreateHandles на ALL элементов управления в форме, которые не сделали этого при запуске приложения.
Я делаю это, потому что я использую метод invoke для добавления данных в элементы управления пользовательского интерфейса и получаю сообщения об ошибках, что для элемента управления не был создан дескриптор. Поэтому я думаю о проверке безопасности при запуске приложения и CreateHandles перед запуском любого другого кода.
Однако я получаю это сообщение об ошибке из приведенного ниже кода. В некотором смысле я понимаю концепцию сообщения об ошибке, но не знаю, как изменить / добавить какой-либо код для этого, чтобы я мог получить доступ к элементу управления?
control.CreateHandle();
Невозможно получить доступ к защищенному элементу управления. CreateHandle () через спецификатор типа «Control»; квалификатор должен иметь тип «Form1» (или производный от него)
Полный код:
public Form1()
{
InitializeComponent();
Thread thread = new Thread(() => EnumerateChildren(this)); thread.IsBackground = true; thread.Start();
}
public void EnumerateChildren(Control root)
{
foreach (Control control in root.Controls)
{
if (control.IsHandleCreated)
{
//Handle is already created
}
else
{
//Force to Create a handle but gives this error:
//Cannot access a protected member control.CreateHandle() via a qualifier of type 'Control'; the qualifier must be of type 'Form1' (orderived from it)
control.CreateHandle();
}
if (control.Controls != null)
{
EnumerateChildren(control);
}
}
}
Я проверил, чтобы добавить приведенный ниже код в статистику "else", где во втором окне сообщения должно отображаться "True", но это тоже не всегда происходит?
else
{
//Force to Create a handle but gives this error:
//Cannot access a protected member control.CreateHandle() via a qualifier of type 'Control'; the qualifier must be of type 'Form1' (orderived from it)
MessageBox.Show("Handle is not created: " + control.IsHandleCreated.ToString());
control.CreateControl();
MessageBox.Show("Handle should be created?: " + control.IsHandleCreated.ToString());
}