DragDrop注册没有成功

System.InvalidOperationException:DragDrop注册未成功。 —> System.Threading.ThreadStateException:

这个例外是什么意思? 我在这一行试图在运行时向面板添加一个面板…

splitReport.Panel1.Controls.Add(ChartPanel); 

在VS2008 C#中工作

此exception意味着已使用MTA线程模型初始化拥有Panel(正在添加的Panel)的线程。 拖放系统要求调用线程使用STA线程模型(特别是它需要通过OleInitialize初始化COM)。 线程模型是COM平台的一个不幸的遗迹,它是.NET平台的前身。

如果Main函数上有[STAThread]属性,那么主程序线程应该已经是STA。 那么,最可能的解释是这个exception发生在另一个线程上。 发生exception时,查看Visual Studio(调试| Windows |线程)中的“线程”窗口,看看您是否在主线程以外的线程上。 如果是,解决方案可能就像为新线程设置线程模型一样简单,您可以执行以下操作(将此代码添加到创建控件的线程中):

Thread.CurrentThread.SetApartmentState( ApartmentState.STA )

ThreadApartmentStateSystem.Threading成员)

在实际启动新线程之前,需要执行该代码。 如@Tomer所述,您还可以使用[STAThread]属性以声明方式指定此属性。

如果您发现主线程上发生了exception,请回发并告诉我们,也许我们可以提供更多帮助。 exception时的堆栈跟踪可能有助于追踪问题。

 function abc { Thread t = new Thread(new ThreadStart(xyz)); t.SetApartmentState(ApartmentState.STA); t.Start( ); } function xyz { the code of Windows form..or whatever which is causing the error } 

在Main方法上添加STAThreadAttribute属性。 如果程序访问OLE相关函数(如Clipboard类),则此属性是必需的。

[STAThread]

static void Main(string [] args)

{

}

我不确定你是否已经解决了这个问题。 我刚遇到这个问题,我通过删除我的bin目录修复了它。

是的,我意识到这个问题是在两年半前提出来的。 我点击了这个例外并做了一些阅读。 我纠正了它,但没有在任何地方看到我的解决方案,所以我想我会把它发布在别人可以阅读的地方。

Main()上标记[STAThread]发生这种情况的一种可能性是,如果你在你开始的线程以外的线程上运行它。

我在尝试在BackgroundWorker.DoWork方法中创建和显示新表单时遇到了这个exception。 为了修复它,我将创建和显示我的新表单包装到一个方法中,然后在该方法上调用Invoke ,以便在UI线程上触发它。 这是因为UI线程从标有[STAThread]Main()方法开始,这里解释了其他答案。

到目前为止最简单的方法是:

 private void DoSomethingOnGui() { if (this.InvokeRequired) { this.Invoke((MethodInvoker)delegate { Safe_DoSomethingOnGui(); }); } else { Safe_DoSomethingOnGui(); } } private void Safe_DoSomethingOnGui() { // Do whatever you want with the GUI } 

你甚至可以传递任何问题:

 private void DoSomethingOnGui(object o) { if (this.InvokeRequired) { this.Invoke((MethodInvoker)delegate { Safe_DoSomethingOnGui(o); }); } else { Safe_DoSomethingOnGui(o); } } private void Safe_DoSomethingOnGui(object o) { // Do whatever you want with the GUI and o } 

我通过使用下面的代码解决了这个错误…我正在使用后台工作者并尝试访问UI而后台工作人员…这就是为什么得到错误 – DragDrop注册没有成功。 我们无法从后台工作程序或线程中运行的代码访问UI。

 BeginInvoke((MethodInvoker)delegate { //write your code here... }); 

谢谢Happy Coding ……:

我最近遇到过这种情况, [STAThreadAttribute]在我的情况下,我通过使用Invoke方法解决了这个问题,它可能对你们有帮助,所以我分享了一些代码片段:

 this.Invoke(new InvokeHandler(delegate() { //Your method here! })); 

而InvokeHandler是这样的委托:

 private delegate void InvokeHandler(); 

我发现了这个错误,我发现显示它的那个是当使用另一个调用MessageBox.Show(this, ...)线程时,这里没有完成初始化。

我们需要删除消息框的所有者以删除错误。