调用ToolStripMenuItem

Zai*_*Ali 11 c# user-controls invoke contextmenustrip winforms

我试图找出是否有办法调用ToolStripMenuItem.

例如,我在返回结果时调用Web服务(ASynchrously).根据结果填充下拉项,(在回调方法中)

 ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start"));
Run Code Online (Sandbox Code Playgroud)

但我得到例外

跨线程操作无效:控制''从创建它的线程以外的线程访问.

没有与工具条项相关联的调用函数,还有另一种方法可以做到这一点吗?我试图以完全错误的方式做到这一点吗?任何输入都会有所帮助.

Jal*_*aid 20

您正在尝试执行依赖于另一个线程中的控制主线程的代码,您应该使用Invoke方法调用它:

toolStrip.Invoke(() =>
{
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
Run Code Online (Sandbox Code Playgroud)

当从与最初创建的控件的线程不同的线程访问控件成员/方法时,您应该使用control.Invoke方法,它将在调用委托中将执行封送到主线程.

编辑:由于您使用的ToolStripMenuItem不是ToolStrip时,ToolStripMenuItem没有Invoke成员,因此,您可以使用由"形式调用this.Invoke"或你toolStrip的父母" ToolStrip"调用,那么:

toolStrip.GetCurrentParent().Invoke(() =>
{
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
Run Code Online (Sandbox Code Playgroud)


Sar*_* S. 5

您正尝试从线程而不是主线程访问菜单项,因此请尝试以下代码:

MethodInvoker method = delegate
{
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
};

if (ToolStripMenu.InvokeRequired)
{
    BeginInvoke(method);
}
else
{
    method.Invoke();
}
Run Code Online (Sandbox Code Playgroud)