2012-11-20 215 views
2

可能重複:
accessing controls on parentform from childform更改標籤文本

我已經父窗體Form1和子窗體TEST1我想改變孩子父窗體標籤文本形式在我的父母形式我有方法showresult()

public void ShowResult() { label1.Text="hello"; }

我想在button button事件中更改label.Text="Bye";窗體我的子窗體test1。請給出任何建議。

調用子窗體時

回答

7

,設置子窗體對象的Parent財產這樣的..

Test1Form test1 = new Test1Form(); 
test1.Show(this); 

在你的父窗體,讓你的標籤文本的屬性等作爲..

public string LabelText 
{ 
    get 
    { 
    return Label1.Text; 
    } 
    set 
    { 
    Label1.Text = value; 
    } 
} 

從你的孩子組成,你可以得到標籤文本那樣..

((Form1)this.Owner).LabelText = "Your Text"; 
+0

'((Form1)this.ParentForm)''在那個label1不可訪問之後 – Milind

+0

@Milind檢查更新的答案 – Talha

+0

我在父窗體中使用labelText屬性,它現在可以在子窗體中訪問,但是在運行時它會拋出異常「Object引用未設置爲對象的實例「。 – Milind

0

嘗試這樣的:

Test1Form test1 = new Test1Form(); 
test1.Show(form1); 

((Form1)test1.Owner).label.Text = "Bye"; 
+0

是否需要創建父窗體的新對象? – Milind

+0

@Milind你是什麼意思? –

+0

從我的子窗體應創建父窗體的新對象,然後訪問標籤控件與新對象? – Milind

4

毫無疑問,有很多的快捷方法可以做到這一點,但在我看來,一個好的辦法是提高從請求父形式變化子窗體的事件顯示的文字。父表單應該在創建孩子時註冊此事件,然後可以通過實際設置文本對其進行響應。

所以在代碼,這將是這個樣子:

public delegate void RequestLabelTextChangeDelegate(string newText); 

public partial class Form2 : Form 
{ 
    public event RequestLabelTextChangeDelegate RequestLabelTextChange; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (RequestLabelTextChange != null) 
     { 
      RequestLabelTextChange("Bye"); 
     } 
    }   

    public Form2() 
    { 
     InitializeComponent(); 
    } 
} 


public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Form2 f2 = new Form2(); 
     f2.RequestLabelTextChange += f2_RequestLabelTextChange; 
    } 

    void f2_RequestLabelTextChange(string newText) 
    { 
     label1.Text = newText; 
    } 
} 

它多一點長篇大論,但是從有其父的任何知識它去將你的子窗體。這對於可重用性來說是一個很好的模式,因爲它意味着子表單可以在沒有中斷的情況下在另一個主機(沒有標籤)中再次使用。