调用抛出 InvalidOperationException
Invoke throwing InvalidOperationException
我遇到了一个难以解决的问题,我希望有人能对此有所启发。我有一个名为 form2
的 Form
,我正在 运行 编写一些代码,使用 MethodInvoker
向该表单的 Listview(s)
添加一些项目,以便UI 线程在我这样做时保持响应。
第一次 运行 一切都很好,但是 当我关闭那个表单(上面有 Listview 的表单)和 运行 我的代码再次 我得到一个 InvalidOperationException: Invoke or BeginInvoke cannot be called on a control until the window handle has been created
.
所以我对此进行了调查,并在谷歌上进行了更多搜索,并在 Whosebug 上进行了查看,我发现问题是由于表单没有为其创建句柄引起的,因为它在第一次关闭时被处理掉.
所以我的解决方案是让它通过 CreateControl()
强制表单为自己设置一个句柄。即使在使用它之后,当我在异常中断中检查它时,我的表单仍然没有设置句柄。它有 00x0000000
或类似的东西,我仍然得到我的 InvalidOperationException
。我也尝试过检查 .isDisposed()
并尝试在那之后使用 CreateControl()
但没有成功。你们以前听说过这个吗? SO 上的其他线程没有为我提供解决方案。
我的代码:
if (!form2.IsHandleCreated)
{
form2.CreateControl();
}
form2.Invoke((MethodInvoker) delegate
{
//Do Stuff Here.
}
因此,由于没有人对此做出回应,我会回答我自己的问题,以防万一有人遇到这个问题,这对他们有帮助。实际上,我最终将其置于我创建的新线程的范围之外,并在按钮 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.");
}
我遇到了一个难以解决的问题,我希望有人能对此有所启发。我有一个名为 form2
的 Form
,我正在 运行 编写一些代码,使用 MethodInvoker
向该表单的 Listview(s)
添加一些项目,以便UI 线程在我这样做时保持响应。
第一次 运行 一切都很好,但是 当我关闭那个表单(上面有 Listview 的表单)和 运行 我的代码再次 我得到一个 InvalidOperationException: Invoke or BeginInvoke cannot be called on a control until the window handle has been created
.
所以我对此进行了调查,并在谷歌上进行了更多搜索,并在 Whosebug 上进行了查看,我发现问题是由于表单没有为其创建句柄引起的,因为它在第一次关闭时被处理掉.
所以我的解决方案是让它通过 CreateControl()
强制表单为自己设置一个句柄。即使在使用它之后,当我在异常中断中检查它时,我的表单仍然没有设置句柄。它有 00x0000000
或类似的东西,我仍然得到我的 InvalidOperationException
。我也尝试过检查 .isDisposed()
并尝试在那之后使用 CreateControl()
但没有成功。你们以前听说过这个吗? SO 上的其他线程没有为我提供解决方案。
我的代码:
if (!form2.IsHandleCreated)
{
form2.CreateControl();
}
form2.Invoke((MethodInvoker) delegate
{
//Do Stuff Here.
}
因此,由于没有人对此做出回应,我会回答我自己的问题,以防万一有人遇到这个问题,这对他们有帮助。实际上,我最终将其置于我创建的新线程的范围之外,并在按钮 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.");
}