2013-10-20 58 views
2

我想使用線程,幷包括一個GUI控制器,所以我需要調用該控制器,但我有這個問題 - 我不能調用這部分代碼中的非委託類型不能調用非委託類型

if (toolStripTextBox1.Text != "") 
{ 
    if (RT[j].tabvalue.ToString() == tabControl1.Invoke(() => 
             { tabControl1.SelectedTab.Name; })) 
    { 
     RT[j].RitchT.Text = getH.getHtmlCode(toolStripTextBox1.Text); 
    } 
} 

,而這是工作,另一方面

tabControl1.Invoke(
    () => { tabControl1.TabPages[R.RitchT.Name].Controls.Add(R.RitchT); 
}); 

這是調用類

public static class ControlExtensions 
{ 
    public static void Invoke(this Control control, Action action) 
    { 
     if (control.InvokeRequired) 
      control.Invoke(new MethodInvoker(action), null); 
     else 
      action.Invoke(); 
    } 
} 

我該如何解決這個問題?

+0

你想通過這一行來實現 - 「tabControl1.SelectedTab.Name」? –

+0

只是返回該選項卡名稱並使用它來檢查if語句中的某些內容 –

+0

這不會編譯。您應該使用Hans Passant在他的回答中指定的'Func '。 –

回答

3
tabControl1.Invoke(() => { tabControl1.SelectedTab.Name; }) 

是的,這不是合法的語法。 Control.BeginInvoke()方法將Delegate作爲其第一個參數。 lambda表達式不會隱式轉換爲Delegate,您必須提供幫助。修復:

tabControl1.Invoke(new Func<string>(() => { return tabControl1.SelectedTab.Name; })) 

您將有更多的麻煩,你不能分配的工作線程一個RichTextBox的Text屬性,你將不得不使用的BeginInvoke()那裏。您將閱讀文本屬性,但它是一個壞主意,他們可能會改變,而工作線程正在運行,並且用戶繼續操作UI。您確實想要支持BackgroundWorker或Task,在啓動它之前收集您需要的數據,並在完成後使用工作人員的結果更新UI。

+0

也委託方法體不正確。它也不會編譯。 –

+0

非常感謝你的工作很好..是的,我有你現在談論的問題..我會嘗試閱讀更多關於這個問題,再次感謝 –