DragDrop注册没有成功

时间:2008-09-25 20:25:06

标签: c# visual-studio-2008

  

System.InvalidOperationException:DragDrop注册没有   成功。 ---> System.Threading.ThreadStateException:

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

splitReport.Panel1.Controls.Add(ChartPanel);

在VS2008 C#中工作

9 个答案:

答案 0 :(得分:35)

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

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

Thread.CurrentThread.SetApartmentState( ApartmentState.STA )

ThreadApartmentStateSystem.Threading

的成员

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

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

答案 1 :(得分:5)

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
}

答案 2 :(得分:3)

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

<强> [STAThread]

static void Main(string [] args)

{

}

答案 3 :(得分:2)

我不确定你是否已经解决了这个问题。我刚遇到这个问题,我用deleting my bin directory修复了它。

答案 4 :(得分:2)

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

[STAThread]上标记为Main()的情况发生这种情况的一种可能性是,如果您在您开始使用的线程之外的其他线程上运行此功能。

我尝试在BackgroundWorker.DoWork方法中创建并显示新表单时遇到此异常。为了解决这个问题,我将创建和显示我的新表单包装到一个方法中,然后在该方法上调用Invoke,以便在UI线程上触发它。这很有效,因为UI线程是从标有Main()的{​​{1}}方法开始的,这里解释了其他答案。

答案 5 :(得分:1)

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

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
}

答案 6 :(得分:1)

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

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

});

谢谢Happy Coding ......:

答案 7 :(得分:0)

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

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

InvokeHandler是这样的委托:

private delegate void InvokeHandler();

答案 8 :(得分:0)

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

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

相关问题