2015-06-08 10 views
5

çalışmıyor ve bunu bazı kere UserControl set, Bu yüzden çağırmak için böyle olduğu halde bir yöntem yazmak:bir UserControl çağırır bir form (<code>MainPage</code>) sahip

delegate void containerPanelCallback(UIPart uiPart); 
public void IncludeUIPart(UIPart uiPart) 
{ 
    if (this.containerPanel.InvokeRequired) 
    { 
     containerPanelCallback d = new containerPanelCallback(IncludeUIPart); 
     containerPanel.Invoke(d, new object[] { uiPart }); 
    } 
    else 
    { 
     containerPanel.Controls.Clear(); 
     containerPanel.Controls.Add(uiPart); 
    } 
    uiPart.Size = this.containerPanel.Size; 
    uiPart.Dock = DockStyle.Fill; 
} 

UIPart sınıf UserControl'dan UserControls benim UIPart öğesinden devralıyorum.

Bu yöntem ve bunun gibi lanse çağırmak:

public class myClass 
{ 
... 
private static MainPage _frmMain; 
private static myUIPart6 UIP6; 
... 
public static void aMethod(/* Some arguments */) 
{ 
    UIP6 = new myUIPart6 { /* Some settings of properties */ }; 
    _frmMain.IncludeUIPart(UIP6); 
    _frmMain.Show(); /*Throws an error*/ 
} 
... 
} 

hatadır:

Çapraz iplik operasyon değil geçerlidir: Denetim 'MainPage' oldu parçacığı dışında başka bir iş parçacığı erişilebilir üzerinde oluşturuldu.

Ben soru ve burada bu hata hakkında birçok cevaplar birçok buldum Ama ben başka bir şey çağırmak durumunda, en _frmMain.Show();? O atıyor neden onu anlamaya olamaz? Yoksa yanlış mıyım? UserControl'ümün tanıtımıyla ilgili midir?

+0

'aMethod' diyorsun? –

+0

Bir ana iş parçacığı tarafından gerçekleştirilen UI ile yapılan tüm işlemler için Invoke() çağrılmalıdır. Örneğinizde, IncludeUIPart() öğesini çağırırken Invoke özelliğini kullanın, ancak _frmMain.Show öğesini çağırırken Invoke(). Bütün aMethod'u Invoke() içinde sarmayı ve IncludeUIPart() –

+0

'dan gelen çağrıyı kaldırmayı kaldırırım 2000'li yılların başında geliştiricinin yanı sıra şaka yaptığınız gibi düşünüyorum;) –

cevap

2

deneyin Aşağıdaki kodu ekleyerek:

public static void aMethodCaller(){ 
if (_frmMain.InvokeRequired) 
    _frmMain.Invoke(new Action(aMethod)); 
else 
    aMethod(); 
} 

ve aMethodCaller() Aşağıda

örnek kod için kodunuzda aMethod() tüm başvuruları değiştirin: Bunu nasıl

class Foo 
{ 
    static Form _frmMain; 
    public static void aMethod() 
    { 
     _frmMain.Show(); 
    }   
    public static void aMethodCaller() 
    { 
     if (_frmMain.InvokeRequired) 
      _frmMain.Invoke(new Action(aMethod)); 
     else 
      aMethod(); 
    } 
} 
+0

aMethod, sorunuzdaki koda göre statiktir, bu yüzden onu _frmMain.aMethod() olarak adlandıramazsınız, değil mi? - hmm, bu zaten silinmiş op yorumunun bir cevabı gibi görünüyor –

+1

İnsanlar neden bu soruna yanlış bir çözüm hiç ve yanlış bir çözüm. Evet çalışıyor, ama başka bir iş parçacığından UI'nuzu değiştirmek için Inovke kullanmanız gerektiğinde bir tasarım hatası. – user743414

+0

@ user743414, haklısınız. Ama dünya kusurlu.Her tasarım kusurludur, çünkü her zaman mükemmellik için yer vardır ;-) Cidden, insanlar “doğru” çözümlerden çok daha fazla çalışan çözümler isterler. Ardından, hatalı ama çalışan çözümlerde problemler bulurlar, işte bu şekilde –

1

_frmMain.Show(), herhangi bir çağrı gereksinimi denetimiyle korunmaz. Yani muhtemelen bir arka plan iş parçacığı olarak çağırıyorsunuz.

+0

Eğer 'aMethod'unuz UI olmayan bir iş parçacığından çağrılırsa, o zaman 'aMethod'da' InvokeRequired' için kontrol etmelisiniz ve 'threaddeUIPart' içinde yaptığınız gibi uygun bir iş parçacığı içinde' _frmMain.Show() 'komutunu çalıştırmalısınız. . – Yegor

+0

Siz onu adlandırdığınızın önemi yok, önemli olan şey _how_ diyorsunuz, yani hangi iş parçacığından. – Yegor

+0

"aMethod" çağıran "MyUIPart5" içinde arama yapan bir "Send" dizim var. –

İlgili konular