2009-11-17 62 views
1

我在我的winforms應用程序中使用DockPanel套件。 DockContent類派生自System.Windows.Forms.Form類,我的兩個窗體dockRounds和dockToolbox繼承自DockContent類。如何訪問繼承的表單上的控件?

這是我第一次做到這一點,這可能是一個愚蠢的問題,但在運行時,如何訪問dockRounds和dockToolbox表單的控件?

這是我如何加載兩種形式,當應用程序第一次運行:

public partial class frmMainNew : Form

clsMWDockPanel mapPanel; 
    dockToolbox dockT = new dockToolbox(); 
    dockRounds dockR = new dockRounds(); 

    public frmMainNew() 
    { 
     InitializeComponent(); 

     dockPanel = new DockPanel(); 

     SuspendLayout(); 

     dockPanel.Parent = panelMain; 
     dockPanel.Dock = DockStyle.Fill; 
     dockPanel.DefaultFloatWindowSize = new Size(108, 528); 

     dockPanel.BringToFront(); 
     dockPanel.BackColor = Color.Transparent; 
     dockPanel.DocumentStyle = DocumentStyle.DockingSdi; 

     ResumeLayout(); 

     string error = "Errors:\r\n"; 
     try 
     { 
      loadRounds(); 
      loadToolbox(); 
     } 
     catch (Exception) 
     { 
      error = error + "The Toolbox and/or Rounds menu could not be created\r\n"; 
     } 

    } 

    public void loadToolbox() 
    { 
     dockT.CloseButton = false; 
     dockT.ShowHint = DockState.Float; 
     dockT.Text = "Toolbox"; 
     dockT.BackColor = Color.WhiteSmoke; 
     dockT.Icon = this.Icon; 
     dockT.Show(dockPanel); 
    } 

    public void loadRounds() 
    { 
     if (mapPanel == null) 
     { 
      CreateMapPanel().Show(dockPanel, DockState.Document); 
     } 

     mapMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; 
     //mapMain.BringToFront(); 

     dockR.CloseButton = false; 
     dockR.ShowHint = DockState.DockRightAutoHide; 
     dockR.Text = "Rounds Menu"; 
     dockR.BackColor = Color.WhiteSmoke; 
     dockR.Icon = this.Icon; 
     dockR.Show(dockPanel); 
    } 

    DockContent CreateMapPanel() 
    { 
     mapPanel = new clsMWDockPanel(); 
     mapPanel.ShowHint = DockState.Document; 
     mapPanel.Controls.Add(mapMain); 

     return mapPanel; 
    } 

提前感謝

萊迪

回答

4

有幾種策略可以用來實現不同窗體上對象之間的通信/鏈接。注意:我的回答不會解決與DockPanelSuite特別相關的任何問題,也不會考慮「次要」形式爲「獨立」(即,它們不是由MainForm「擁有」)或存在主孩子的形式。這是一種有意識的選擇,其基礎是相信您所問的與實施中可能存在的差異無關。

  1. 最簡單的策略(如果乏味了很多的控件)正在申報中,揭露出你想從你的主要方式操縱控制您的輔助形式的公共屬性。例如,假設窗體2有一個按鈕,你要處理的主要形式,它的單擊事件:

在Form2的定義就像一個屬性:在Load事件

public Button form2Button 
{ 
    get { return button1; } 
} 

現在你主要形式,假設這是在其中創建窗體2的實例,您可以訂閱按鈕的Form 2上的Click事件:

Form2 myForm2; 
Form3 myForm3; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    myForm2 = new Form2(); 
    myForm2.form2Button.Click += new EventHandler(form2Button_Click); 

    myForm3 = new Form3(); 
} 

而且你可以很容易地想象,在Form3你有你已經暴露一個TextBox公共財產以同樣的方式暴露Form2上的Button。

所以,你可以實現的MainForm的事件處理這樣的Form 2上按鈕點擊:

public void form2Button_Click(object sender, EventArgs e) 
{ 
    // do something here with the TextBox on Form3 
    // myForm3.theTextBox.Text = 
} 

...等策略...

  • 例如,按鈕按鈕可以引發主要表單(或Form2所暴露的任何其他實體)可以訂閱的公共事件,然後將適當的任何內容分發給適當的目標。

  • 您可以在較高級別將消息傳遞通常抽象爲發佈者發送消息的單個(也許是靜態的)類,並將消息分派給註冊的偵聽器。

  • 最後,這裏的討論可能會感興趣的你:

    Using The Controls Of One Form Into Another

    最好,

    +0

    感謝比爾,我已經測試過這個,你的第一個建議很好用 - 但是,對這兩種形式有很多控制 - 是否有任何方法可以將這些控件的事件代碼放在單獨的類中,以便不會混淆主要的表單代碼,但仍然可以引用控件?再次感謝 – leddy 2009-11-18 12:24:51

    +0

    .NET FrameWork 3.5,C#3.0中的注意事項,你有「自動屬性」,它可以爲你節省大量的輸入。 MS的Dan Whalin快速「一次性」:http://weblogs.asp.net/dwahlin/archive/2007/12/04/c-3-0-features-automatic-properties.aspx更多詳情請參閱:http ://msdn.microsoft.com/en-us/library/bb384054.aspx對於您提出的更廣泛的問題,我們需要了解更多關於您的應用程序的信息:例如,是否存在對象連接的模式。我正在使用一個單獨的靜態類,它可以作爲「調度」中心,用於跨表單同步事件/內容。最好, – BillW 2009-11-18 14:55:19

    0

    您是否嘗試訪問Controls財產?

    var controls = dockRounds.Controls; 
    
    +0

    感謝Jared - 是的,我可以從主窗體訪問控件,但是如何使用dockToolbox窗體上的按鈕的單擊事件更改dockRounds窗體上的文本框中的值?是否有可能在設計時編寫這個代碼? 再次感謝,leddy – leddy 2009-11-17 17:10:37

    +0

    dockRounds和dockToolbox是兄弟姐妹 - 它聽起來像你需要一個靜態事件。 – 2009-11-17 18:21:51

    1

    你的班,dockRounds和dockToolbox應該公開,你想要的任何屬性/事件訪問。所以,如果你想連接到一個控件的事件,將其路由到一個公共事件。

    0

    您可以在控件上設置訪問修飾符,使其儘可能地易於訪問。默認是「私人」,這就是爲什麼你不能從主窗體訪問控件。

    在Visual Studio中的屬性選項卡上,有一個Modifiers屬性,用於設置在生成的設計器文件中使用的訪問修飾符。

    將此設置爲「公開」,您可以從主窗體訪問該控件。

    我剛剛使用這個,當我從另一個形式繼承一種形式。通過將修飾符設置爲「Protected」(或「Protected Internal」),我可以訪問基類中定義的控件。