Не удается получить доступ к защищенному элементу управления. CreateHandle () - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь принудительно создать 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());
}

1 Ответ

0 голосов
/ 16 марта 2019

Я добавил логику, если CreateControl () не удается создать дескриптор. Я делаю createHandle () напрямую, и теперь все элементы управления показывают значение true, что означает, что оно работает.

Здесь все элементы управления получают свою ручку. Скажите, пожалуйста, это неправильный подход?

public void EnumerateChildren(Control root)
{
    foreach (Control control in root.Controls)
    {
        if (control.IsHandleCreated)
        {
            //Handle is already created
        }
        else
        {
            control.CreateControl();
            if (control.IsHandleCreated == false)
            {
                //The access the handle directly
                MethodInfo ch = control.GetType().GetMethod("CreateHandle", BindingFlags.NonPublic | BindingFlags.Instance);
                Invoke((System.Windows.Forms.MethodInvoker)delegate { ch.Invoke(control, new object[0]); });
            }
        }
        if (control.Controls != null)
        {
            EnumerateChildren(control);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...