我創建的,從開發環境,多層次的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");
}