2017-03-02 58 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