2012-04-03 37 views
0

在我當前的應用程序中,我有一個main form: frmMain,其中有一個statusstrip和一個label: lblStatus。 我想從我的用戶控件,我添加到我的主窗口中更新標籤,當我點擊有關按鈕:從用戶控件更新主表單中的標籤

ucBeheer ucBeheer = new ucBeheer(); 
splitContainer1.Panel2.Controls.Add(ucBeheer); 

從我usercontrol裏面,當我做一個動作,我想更新lblStatus。我曾嘗試加入以下屬性來我的主要形式有:

public string updateStatus 
    { 
     get { return lblStatus.Text; } 
     set { lblStatus.Text = value; } 
    } 

然後訪問這樣的方法在我的用戶控件:

 frmMain mainForm = new frmMain(); 
     mainForm.updateStatus = "This is a test"; 

但是,這並不工作,我知道,這是因爲我在做我的frmMain的新對象,但我不知道如何解決,否則這個?

我也發現了following wayEvent Handler,但我不能這樣做,因爲我的用戶控件實際上並沒有在我的mainForm中,直到我點擊按鈕添加它,所以我沒有有一個參考。

所以我有點出出主意,我希望有人能幫助我。 謝謝, 托馬斯

編輯:所以我設法做到這一點的方式如下:

 frmMain owningForm = (frmMain)this.Parent.Parent.Parent.Parent; 
     owningForm.updateStatus = "This is a test"; 

this.Parent.Parent.Parent.Parent...並沒有真正看起來良好的編碼對我來說,有沒有其他的方式來獲得最頂級家長?

回答

5

你可以像這樣添加屬性到你的用戶控件,這個是用戶控件駐留在您可以訪問frmMain

public frmMain MainForm 
{ 
    get 
    { 
     var parent = Parent; 
     while (parent != null && (parent as frmMain) == null) 
     { 
      parent = parent.Parent; 
     } 
     return parent as frmMain; 
    } 
} 

UPDATE: 如果你只是想在最上面的父母,你可以使用這樣的事情:

public Control TopMostParent 
{ 
    get 
    { 
     var parent = Parent; 
     while (parent.Parent != null) 
     { 
      parent = parent.Parent; 
     } 
     return parent; 
    } 
} 

甚至使這方面的一個擴展方法:

public static Control TopMostParent(this Control control) 
{ 
    var parent = control.Parent; 
    while (parent.Parent != null) 
    { 
     parent = parent.Parent; 
    } 
    return parent; 
} 
+0

謝謝,這工作! :) – Schoof 2012-04-03 07:51:24

1

你的控制和形式有溝通,這樣一個需要「知道」其他。實際上,這意味着提供一個參考,另一個參考。所以,你有2個選擇:要麼控制需要引用的形式,或窗體需要控制的參考。

我會做到這一點的方法是對的形式訂閱由控制公佈的一個事件。這是僅僅提供其控制方法之一的形式。

class StatusChangedEventArgs : EventArgs 
{ 
    public string Text { get; set; } 
} 

partial class MyControl : UserControl 
{ 
    public event EventHandler<StatusChangedEventArgs> StatusChanged = delegate { }; 

    public void RaiseStatusChanged(string message) 
    { 
     StatusChanged(this, new StatusChangedEventArgs { Text = "message" }); 
    } 
} 

然後,在你的表格,訂閱事件:

... 
ucBeheer ucBeheer = new ucBeheer(); 
ucBeheer.StatusChanged += HandleStatusChanged; 
splitContainer1.Panel2.Controls.Add(ucBeheer); 
... 

partial class MyForm : Form 
{ 
    void HandleStatusChanged(object sender, StatusChangedEventArgs args) 
    { 
     lblStatus.Text = args.Text; 
    } 
} 
+0

感謝您的評論,但我真的不明白如何實現這一點?我會在哪裏放置「StatusChangedEventArgs」類,以及如何讓它能夠從我的標籤中獲取和設置文本? – Schoof 2012-04-03 07:56:13

+0

我已經添加了一個代碼示例。當你需要控制時,只需調用'RaiseStatusChanged'。 – 2012-04-03 07:58:10

+0

謝謝,這在我的大多數表單中都能正常工作,但是在某些情況下,我在'usercontrol'中添加了一個'usercontrol',然後就無法工作。 (我不確定在usercontrol中添加'usercontrol'是否是好的編碼,但是這是我發現能夠正確導航的唯一方法) – Schoof 2012-04-03 08:02:25

-1

您可以使用應用程序引用您的應用程序的主要形式。OpenForms FormCollection按名稱:

frmMain owningForm =(frmMain)Application.OpenForms [「frmMain」];

owningForm.updateStatus =「這是一個測試」;

相關問題