2017-03-02 44 views
0

我正在使用WinForms創建應用程序。我有panel其中我顯示user control。在user control裏面我有一個button。當我點擊按鈕時,我想清除panel並顯示不同的user control。我想,使用下面的代碼來執行:從面板內部更改面板控制

private void btnCreateOffer_Click(object sender, EventArgs e) 
{ 
    var myControl = new WindowsFormsDemo.View.CreateOffer(); 
    MockUpForm.panMain.Controls.Clear(); 
    MockUpForm.panMain.Controls.Add(myControl); 
} 

這個工作從直接在parrent形式放置的按鈕,但是當我在使用user control裏面,它說:

'MockUpForm.panMain' is inaccessible due to its protection level

我假設它與私人/公共課有關。但我寧願擁有「正確」的解決方案,而不是將所有事情都改爲公開。

有關如何通常這樣做的任何建議?

+1

這是根本錯誤的方式來做到這一點。舉一個事件來代替,你的主表單可以訂閱它並在其控件上晃動。使用Controls.Clear()也是非常非常錯誤的,你必須在你刪除的任何控件上調用Dispose()方法,否則會導致永久性內存泄漏。 –

+0

感謝您的意見。我對WinForms相當陌生,所以我很可能會做很多事情*非常*錯:-)。我將研究事件方法... – Noceo

+0

@HansPassant:他沒有提到他是否想重新使用刪除的控件。但如果事件也訂閱處置是不夠的,無論如何會發生內存泄漏。 – taffer

回答

1

方案1(醜):

panMain公衆的設計師 modifiers

解決方案2(略好):

提供公共的方法來安全地實現這樣的任務:

// MockUpForm code: 

public void ClearPanelControls() 
{ 
    panMain.Controls.Clear(); 
} 

public void AddControlToPanel(Control c) 
{ 
    panMain.Controls.Add(c); 
} 

然後調用這些方法,而不是發佈完整的液晶面板,這使得例如可以配置整個面板之類的事......

+0

我無法獲得**解決方案2 **工作。我無法從用戶控件訪問主窗體中的方法。即使他們是公開的......? – Noceo

+0

您能否包含一張圖片?在我看來,你想要刪除點擊按鈕以及面板中的其他控件... – taffer

1

UserControl訪問父窗體的控制,您可以使用delegateevent

是這樣的....

Windows窗體(父窗體)代碼....

public Form1() 
{ 
    InitializeComponent(); 
    userControl1.CreateOffer += UserControl1_CreateOffer; 
} 

private void UserControl1_CreateOffer() 
{ 
    var myControl = new WindowsFormsDemo.View.CreateOffer(); 
    this.panMain.Controls.Clear(); 
    this.panMain.Controls.Add(myControl); 
} 

用戶控制代碼...

internal delegate void CreateOfferDelegate(); 
internal event CreateOfferDelegate CreateOffer; 

public UserControl1() 
{ 
    InitializeComponent(); 
} 

private void btnCreateOffer_Click(object sender, EventArgs e) 
{ 
    CreateOffer(); 
} 
+0

它不喜歡'FinancingCalculator.CreateOffer + = FinancingCalculator_CreateOffer'這一行。它給出了以下錯誤:*非靜態字段,方法或屬性'FinancingCalculator.CreateOffer'需要對象引用* – Noceo

+0

顯然,我需要聲明'靜態內部事件...「 – Noceo