2011-12-31 24 views
1

我是一個C#新手,並遇到以下問題。從另一個類C與Windows控件交互#

我有一個叫Form1的類,它在設計視圖中包含了許多控件。

我有一個名爲Staff另一類從Form1,並且,除其他外,包含一個名爲PlayAll方法可以播放所有的其他的後一個音樂鍵盤一個由用戶播放的音樂音符繼承。

在方法PlayAll中,我實現了一個條件,該條件確定用戶是否按下了任何註釋。

如果用戶沒有按任何註釋,應當在ErrorTextBox顯示錯誤消息(包含在Form1.cs)。

這是PlayAll()(在Staff.cs)的相關代碼

public void PlayAll() 
{ 
    ErrorTextBox.Text = ""; 
    if (Pressed_Notes.Count == 0) //check if the user pressed a key 
    { 
     ErrorTextBox.Text = "There are no music notes to play!"; 
    } 
    else 
    { 
     //Play the music notes 
    } 
} 

我的問題是出現在ErrorTextBox(在Form1.cs中找到)什麼都沒有。我該如何解決這個問題?謝謝。

+0

你沒有得到任何錯誤信息(例如一個'Exception')? – Adam 2011-12-31 08:53:22

+0

不可以。ErrorTextBox只保留空白 – Joe 2011-12-31 08:54:10

+0

您確定該函數正在被調用,或者您認爲將執行的'if'塊的一部分正在執行嗎? – 2011-12-31 08:54:20

回答

0

您不能從其他類訪問任何表單控件。訪問它們的簡單方式是不安全的方式,在這裏它是.. 讓我們假設你有一個類form1它有一個控件Textbox1 和你有另一個類myClass。只需通過ref作爲參數傳遞所需的控件即可。 例如

public Class myClass 
{ 
TextBox tb; 
public myClass(ref TextBox mtb) 
    { 
    tb = mtb; 
    } 
//...Now you can use tb as your textbox and the value in it will be 
//...displayed on form1 control 
} 

public Class form1 
{ 
myClass mc = new myClass(ref textBox1); 
// ... 
} 

但請記住,它是一個不安全的操作。這段代碼會在調試模式下拋出錯誤。因此無需調試即可運行。

0

這裏主要的問題是當你繼承了職員類中的form1類。通過人員訪問form1的表單成員(標籤)是不可能的。

這就是爲什麼你面臨這個問題。

如果您有任何疑問,請聯繫。

0

This link會告訴你3種方法來解決這個問題。我建議你專注於凱文解答的答案。

1-創建Form 1上的把手,使標籤改性劑公共和acessing它Form 2上

2-(不可取的,在該鏈接的問題解釋)傳遞變量參數到窗體2(第一個選項中凱文的答案)

3-創建將更新值(在凱文的回答第二個選項)

發表評論,如果您需要了解更多信息的事件。

1

繼承不會在相關類的實例(對象)之間創建鏈接。

public class Form1 : Form 
{ 
    public TextBox ErrorTextBox; 
} 

public class Staff : Form1 
{ 
    public void PlayAll() { } 
} 

讓我們創建兩個實例

Form1 form1 = new Forms1(); 
form1.Show(); 

Staff staff = new Staff(); 
staff.Show(); 

這種開放式兩種形式。現在有兩個不同的ErrorTextBoxes:一個表格爲form1,一個表格爲staff

我建議這個問題有兩種不同的解決方案:

  1. 與其打開Form1開放Staff的。

  2. 將參考文獻form1form1.ErrorTextBox傳遞給staff

您可以通過構造函數注入來做#2。改變Staff的構造器:

private TextBox _form1ErrorTextBox; 

public Staff (Form1 form1) 
{ 
    InitializeComponent(); 
    _form1ErrorTextBox = form1.ErrorTextBox; 
} 

public void PlayAll() 
{ 
    _form1ErrorTextBox.Text = ""; 
    if (Pressed_Notes.Count == 0) { 
     _form1ErrorTextBox.Text = "There are no music notes to play!"; 
    } else { 
     //Play the music notes 
    } 
} 

現在,你可以通過的Form1一個實例Staff這樣的:

Form1 form1 = new Forms1(); 
form1.Show(); 

Staff staff = new Staff(form1);