2011-08-22 22 views
8

Próbuję dowiedzieć się, czy istnieje sposób Invoke ToolStripMenuItem.Wywołać ToolStripMenuItem

Na przykład, wzywam usługę internetową (ASynchrously), gdy wynik jest returned.i populate spaść przedmioty według rezultacie (W oddzwaniania metody)

ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start")); 

ale otrzymuję wyjątek

Nieprawidłowe działanie wątku krzyżowego: Kontrola "" uzyskana z wątku innego niż wątek, w którym został utworzony.

Nie ma funkcji invoke związane z rzeczą ToolStrip, Czy istnieje inny sposób mogę to zrobić? Czy próbuję to zrobić w całkowicie niewłaściwy sposób? Pomocne byłoby każde wejście.

Odpowiedz

17

Próbujesz wykonanie kodu, które opierają się na kontroli głównego wątku w innym wątku, należy nazwać używając Invoke metody:

toolStrip.Invoke(() => 
{ 
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start")); 
}); 

Przy dostępie kontrole członków/metod z wątku, który różni się od wątku, który formant pierwotnie utworzony na, powinieneś użyć metody control.Invoke, to przekaże wykonanie w delegacie do głównego wątku.

Edit: Ponieważ używasz ToolStripMenuItem nie ToolStrip The ToolStripMenuItem nie posiada Invoke członka, więc można użyć forma powoływania przez "this.Invoke" lub swojej toolStrip jego rodzica "ToolStrip" Invoke, więc:

toolStrip.GetCurrentParent().Invoke(() => 
{ 
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start")); 
}); 
+0

Jak wywołać ToolStripMenuItem? Ta formant nie ma metody invoke? –

+0

Domyślam się, że on wie ... po prostu nie może znaleźć – Carsten

+0

Khan, jeśli używasz wpf, musisz użyć 'Dispatcher.Invoke' –

4

próbujesz uzyskać dostęp do menu z wątku zamiast głównego wątku, więc wypróbować ten kod:

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

if (ToolStripMenu.InvokeRequired) 
{ 
    BeginInvoke(method); 
} 
else 
{ 
    method.Invoke(); 
} 
+1

+1 za wskazanie' InvokeRequired' i 'BeginInvoke' –