调用抛出 InvalidOperationException

我遇到了一个问题,我很困惑,我希望有人能对此有所了解。我有一个Form调用form2,我正在运行一些代码以Listview(s)使用 a将一些项目添加到该表单中,MethodInvoker以便 UI 线程在我这样做时保持响应。


第一次使用它时一切都运行良好,但是当我关闭该表单(上面有 Listview 的那个)并再次运行我的代码时,我得到了一个InvalidOperationException: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.


因此,我对此进行了调查,并在 Google 上进行了更多搜索,并查看了 StackOverflow,我发现问题是由于表单没有为其创建句柄引起的,因为它在第一次关闭时就被处理掉了。所以我的解决方案是让它强制表单通过CreateControl(). 即使在使用它之后,当我在异常中断中检查它时,我的表单仍然没有设置句柄。它有00x0000000或类似的东西,我仍然得到我的InvalidOperationException. 我也尝试过检查.isDisposed()并尝试使用CreateControl(),但没有运气。你们有没有人听说过这个?SO上的其他线程对我没有任何解决方案。


我的代码:


            if (!form2.IsHandleCreated)

            {          

             form2.CreateControl();

            }



            form2.Invoke((MethodInvoker) delegate

            {

             //Do Stuff Here.

            }


FFIVE
浏览 179回答 1
1回答

哆啦的时光机

因此,由于没有人对此做出回应,因此我将回答我自己的问题,以防有人遇到此问题并对其有所帮助。实际上,我最终把它放在了我创建的新线程的范围之外,并在按钮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.");    }
打开App,查看更多内容
随时随地看视频慕课网APP