Вызвать выбрасывание InvalidOperationException - PullRequest
0 голосов
/ 07 сентября 2018

У меня возникла небольшая проблема, на которую я поставил вопрос, и я надеялся, что кто-нибудь сможет пролить свет на это. У меня есть Form с именем form2, и я запускаю некоторый код для добавления некоторых элементов в Listview(s) этой формы, используя MethodInvoker, так что поток пользовательского интерфейса остается отзывчивым, пока я так делаю.

В первый раз все работает нормально, но потом , когда я закрываю эту форму (ту, на которой есть ListView) и снова запускаю свой код Я получаю InvalidOperationException: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

Итак, я посмотрел на это и немного погуглил, а также посмотрел на StackOverflow и обнаружил, что проблема вызвана тем, что в форме не было создано дескриптора для нее, поскольку она удаляется при закрытии в первый раз. Таким образом, мое решение состояло в том, чтобы заставить форму установить дескриптор для себя через CreateControl(). Даже после этого моя форма все еще не устанавливает дескриптор, когда я проверяю его в разрыве из исключения. У него 00x0000000 или что-то в этом роде, и я все еще получаю InvalidOperationException. Я также попытался проверить .isDisposed() и попытался использовать CreateControl() после этого безуспешно. Кто-нибудь из вас слышал об этом раньше? Другие потоки на SO не дают никаких решений для меня.

Мой код:

            if (!form2.IsHandleCreated)
            {          
             form2.CreateControl();
            }


            form2.Invoke((MethodInvoker) delegate
            {
             //Do Stuff Here.
            }

1 Ответ

0 голосов
/ 10 сентября 2018

Так что, поскольку никто не ответил на это, я отвечу на свой вопрос на случай, если кто-нибудь столкнется с этим, и это поможет им. Я на самом деле закончил тем, что вывел это за рамки моей новой созданной темы и создал форму в событии кнопки click. Затем я проверил, была ли моя форма Disposed или все еще открыта, и создал на ее основе новые экземпляры формы.

Это мой код:

    var checkDMS = CheckIfNull(dealtxt.Text);
    if (checkDMS)
    {
        //If DMS Deal is valid -> If Form is Closed -> 
        if (form2.IsDisposed)
        {
            // If Form not open -> Create new instance 
            form2 = new Form2();
            form2.Show();
            form2.SendToBack();
        }
        else
        {
            // If Form still open -> Close and make new instance.
            form2.Close();
            form2 = new Form2();
            form2.Show();
            form2.SendToBack();
        }

        runDMSQueryFromNewThread(materialCheckBox1.Checked);
    }
    else
    {
        MessageBox.Show("Cannot Pull Deal From DMS.");
    }
...