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

Iをプライベート/パブリッククラスと関係があるとします。しかし、私はむしろすべてを公的に変えるのではなく、 "正しい"解決策をとるだろう。

これは通常どのような方法での提案ですか?

+1

それは、これを行うには根本的に間違った方法です。代わりにイベントを発生させると、あなたのメインフォームがそれを購読してコントロールを揺らすことができます。 Controls.Clear()を使用することも非常に*非常に間違っています。あなたが削除したコントロールでDispose()メソッドを呼び出す必要があります。そうしないと永続メモリリークが発生します。 –

+0

コメントありがとうございます。私はWinFormsには全く新しいので、多くのことをやっている可能性が非常に高い*間違った:-)。私はイベントメソッドを調べます... – Noceo

+0

@HansPassant:彼は彼が削除されたコントロールを再利用したいかどうかは言及しませんでした。しかし、イベントが登録されていても処分では不十分な場合は、とにかくメモリリークが発生します。 – taffer

答えて

1

ソリューション1(醜い):

が安全にそのようなタスクを達成するために、パブリックメソッドを提供します(やや良い) modifiers

解決方法2:

はデザイナーでpanMain公衆を作ります:

// MockUpForm code: 

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

public void AddControlToPanel(Control c) 
{ 
    panMain.Controls.Add(c); 
} 
から親フォームのコントロールにアクセスするには

そして、これらのメソッドの代わりに、パネル全体と、そのようなものを処分するために、たとえば可能にする完全なパネルを、公開を呼び出す...

+0

解決策2 **を作業。私は、ユーザーコントロールからメインフォームのメソッドにアクセスすることはできません。彼らは一般公開されています...? – Noceo

+0

イメージを添付してください。パネルの他のコントロールと一緒にクリックされたボタンを削除したいと思うようです。 – taffer

1

あなたが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

明らかに 'static internal event'を宣言する必要がありました... – Noceo

関連する問題