DragDrop注册失败
时间:2020-03-06 14:44:50 来源:igfitidea点击:
System.InvalidOperationException: DragDrop registration did not succeed. ---> System.Threading.ThreadStateException:
此异常是什么意思?我在此行中尝试在运行时将面板添加到面板中...
splitReport.Panel1.Controls.Add(ChartPanel);
在VS2008 C#中工作
解决方案
此异常意味着拥有该面板(正在添加的面板)的线程已使用MTA线程模型进行了初始化。拖放系统要求调用线程使用STA线程模型(特别是需要通过OleInitialize初始化COM)。线程模型是COM的不幸痕迹,COM是.NET平台的前身。
如果我们在Main函数上具有[STAThread]
属性,则主程序线程应该已经是STA。因此,最可能的解释是此异常发生在不同的线程上。发生异常时,请查看Visual Studio中的"线程"窗口("调试" |" Windows" |"线程"),查看我们是否在主线程之外的线程上。如果是这样,则解决方案可能与为该新线程设置线程模型一样简单,我们可以按照以下步骤进行操作(将此代码添加到正在创建控件的线程中):
Thread.CurrentThread.SetApartmentState(ApartmentState.STA)
(Thread
和ApartmentState
是System.Threading
的成员)
该代码将需要在实际启动新线程之前发生。如@Tomer所指出的,我们也可以使用[STAThread]属性来声明性地指定它。
如果我们发现该异常发生在主线程上,请发回邮件并告知我们,也许我们可以提供更多帮助。发生异常时进行堆栈跟踪可能有助于找出问题所在。
我不确定我们是否已解决此问题。我刚遇到这个问题,并通过删除我的bin
目录来解决。