【发布时间】:2018-08-10 07:09:28
【问题描述】:
我收到以下异常:
在窗口之前不能在控件上调用 Invoke 或 BeginInvoke 句柄已创建。
我正在使用 betterlistviewer 和 dotnetbar 只是修改此代码 Registry cleaner 但我试图以另一种形式调用所有类和控件,而不是在 main 中。
这是我的代码
public Registry_Scan()
{
InitializeComponent();
StartScanning GeekStartCleaning = StartScanning.GeekCreateControl();
GeekStartCleaning.GeekOnAllScanComplete += GeekOnScanComplete;
this.GeekPanel.Controls.Add(GeekStartCleaning);
}
ScanComplete GeekOnComplete = new ScanComplete();
public void GeekOnScanComplete(ref List<BetterListViewGroup> _GeekListOfGroupTargets)
{
List<BetterListViewGroup> GeekListOfGroupTargets = _GeekListOfGroupTargets;
GeekOnComplete.GeekAddRangeTargets(ref GeekListOfGroupTargets);
GeekOnComplete.Show();
this.GeekPanel.Invoke(new MethodInvoker(() =>
{
this.GeekPanel.Controls.Clear();
this.GeekPanel.Controls.Add(GeekOnComplete);
}));
}
不知道怎么回事,请帮忙
System.InvalidOperationException H结果=0x80131509 Message=Invoke 或 BeginInvoke 在创建窗口句柄之前不能在控件上调用。 源=System.Windows.Forms 堆栈跟踪: 在 System.Windows.Forms.Control.MarshaledInvoke(控制调用者,委托方法,对象 [] 参数,布尔同步) 在 System.Windows.Forms.Control.Invoke(委托方法,对象 [] 参数) 在 System.Windows.Forms.Control.Invoke(委托方法) 在 GeekCleaner.Registry_Scan.GeekOnScanComplete(List`1& _GeekListOfGroupTargets) 在 C:\Users\RamRo\source\repos\GeekVersion1\GeekCleaner\GeekCleaner\RegistryScan.cs:line 34 在 GeekCleaner.UserPanel.StartScanning.GeekStartScanning() 在 C:\Users\RamRo\source\repos\GeekVersion1\GeekCleaner\GeekCleaner\UserPanel\StartScanning.cs:line 139 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart()
【问题讨论】:
-
也许可以尝试 BeginInvoke()...
-
那也行不通
-
你可能启动线程太早了,Load 事件是一个很好的启动它的地方。或者您在线程仍在运行时关闭了表单,这很糟糕。 stackoverflow.com/a/1732361/17034
-
您正在通过在基本窗口未准备好时(在构造函数中)调用的方法引用控件。将这些方法移至 Form.Load() 或 Form.Shown() 事件。此时,所有控件都将创建自己的句柄。
-
你能在上面做一些示例代码吗\
标签: c# windows winforms registry