我遇到了一个困扰的问题,希望有人能对此有所了解。我有一个名为Form
的{{1}},并且我正在运行一些代码,以使用form2
将某些项目添加到该表单的Listview(s)
中,以便UI线程在我这样做。
第一次运行一切都很好,但是当我关闭该表单(上面有Listview的表单)并再次运行我的代码时, MethodInvoker
。
因此,我对此进行了调查,并在StackOverflow上进行了更多搜索,发现该问题是由于表单没有为其创建句柄而引起的,因为该表单在第一次关闭时就被丢弃了。
因此,我的解决方案是使它强制表单通过InvalidOperationException: Invoke or BeginInvoke cannot be called on a control until the window handle has been created
为其自身设置一个句柄。即使使用了此功能,在我从异常中断处检查它时,窗体仍未设置该句柄。它有CreateControl()
或类似名称,但我仍然得到我的00x0000000
。我也尝试过检查InvalidOperationException
并在此之后尝试使用.isDisposed()
,但是没有运气。你们有没有听说过? SO上的其他线程对我来说没有解决办法。
我的代码:
CreateControl()
答案 0 :(得分:0)
因此,由于没有人对此做出回应,因此我将回答我自己的问题,以防有人遇到此问题并为他们提供帮助。实际上,我最终将其置于创建的新线程的范围之外,并在按钮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.");
}