我创建的,从开发环境,多层次的ToolStripMenuItem堆栈中创建的线程以外的线程访问。ToolStripMenuItem:跨线程操作无效:控制从比它是在
问题: 1)码(下文)用于预先设置工具条项的值。有两个ToolStripMenuitems,其中myItem.GetCurrentParent()。InvokeRequired不等于this.InvokeRequired。 GetCurrentParent.InvokeRequired产生正确的结果一个项目,this.InvokeRequired适用于其他。所有其他项目可以使用任一格式正常工作 2)如果我绕过预设过程,并且程序正在运行,我点击顶层ToolStripMenuItem,程序就会通过“Cross-thread”消息崩溃。
详情: 的形式和所有控件的形式从开发环境中创建。 Visual Studio创建一个启动类,它通过“Application.Run(new cfrmParent());”静态运行' 'InitializeComponent()设置我的所有控件没有任何问题。 我用“public cfrmCommand CmdFrm = new cfrmCommand();”实例化表单 然后我有一个单独的线程执行一个CmdFrm.ShowDialog以允许用户操作控件(并允许其他外部进程更新窗体上的显示)。当出现错误#2时,它会对ShowDialog命令执行此操作。
加载窗体时,我预设ToolStrip的菜单项。这是问题发生的地方。表单上的所有其他控件及其相关代码都能正常工作。如果我删除顶部ToolStripMenuItem中的所有子菜单项,则该项可正常工作。
怀疑: 我对问题的“猜测”是Visual Studio不能通过正确的线程检查过程从上层菜单项访问工具条项目。当我点击顶级项目时,它会尝试加载在不同线程上创建的较低级别的项目。
对我来说是正确的解决方案,只能创建,附加和编程预设的下一级菜单项上点击时,上级的项目或有更好的方法来解决这个问题? 感谢您的帮助。
我的代码,以预设的菜单项:
private void WriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string writeValue)
{
if (myItem.GetCurrentParent().InvokeRequired != this.InvokeRequired)
{
int myTest = 1;}
if (this.InvokeRequired)
{
this.Invoke(new dlgWriteMenuItem(ivkWriteMenuItem), myItem, writeValue);}
else
{
ivkWriteMenuItem(myItem, writeValue);}
}
private delegate void dlgWriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string writeValue);
private void ivkWriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string myValue)
{
myItem.Checked = (myValue.Trim().ToUpper() == "TRUE");
}