为了账号安全,请及时绑定邮箱和手机立即绑定

调用抛出 InvalidOperationException

调用抛出 InvalidOperationException

C#
FFIVE 2022-01-09 10:18:05
我遇到了一个问题,我很困惑,我希望有人能对此有所了解。我有一个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.            }
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

因此,由于没有人对此做出回应,因此我将回答我自己的问题,以防有人遇到此问题并对其有所帮助。实际上,我最终把它放在了我创建的新线程的范围之外,并在按钮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.");

    }


查看完整回答
反对 回复 2022-01-09
  • 1 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信