2011-08-22 17 views
8

ToolStripMenuItem'i çağırmanın bir yolu olup olmadığını anlamaya çalışıyorum. ÖrneğinÇağır ToolStripMenuItem

, sonuç

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

(çağrı arka yöntem olarak), sonucuna göre öğeleri returned.i olarak doldurulur açılır ama ben istisna

dönünce bir web hizmeti (ASynchrously) arıyorum

Çapraz iş parçacığı geçerli değil: Denetim '' üzerinde oluşturduğu iş parçacığı dışındaki bir iş parçacığından erişildi. Bunu başka bir yoludur Araç şeridini öğesi ile ilişkili bir fonksiyonu çağırmak yoktur

, var mı? Bunu tamamen yanlış şekilde yapmaya çalışıyorum mı? Herhangi bir giriş yararlı olacaktır.

Sen başka bir iş parçacığı kontrol ana iş parçacığı güvenmek kodu çalıştırmak için çalışıyoruz

cevap

17

, Sen Invoke yöntemini kullanarak çağırmalıdır:

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

kontrolleri iplik farklı bir iş parçacığı gelen üyeler/yöntemleri erişen İlk olarak oluşturulan denetim, control.Invoke yöntemini kullanmalısınız, ana iş parçacığı için sözdizimi yürütme yürütme marshal olacaktır.

Düzenleme: Eğer ToolStripMenuItem değil ToolStrip kullandığınıza göre, böylece, ToolStripMenuItemInvoke bulunmamaktadır, bu yüzden formu "this.Invoke" veya toolStrip onun ebeveyn "ToolStrip" Invoke tarafından çağırmak kullanabilirsiniz ya:

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

ToolStripMenuItem Nasıl Kullanılır? Bu kontrolün invoke yöntemi yoktur? –

+0

Sanırım bunu biliyor ... o sadece bulamıyor – Carsten

+0

Khan için wpf kullanıyorsanız 'Dispatcher.Invoke' –

4

Sen ziyade ana iş parçacığı daha iplikten menü öğesi erişmek, bu nedenle bu kodu denemek için çalışıyoruz:

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

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

+1 –

İlgili konular