C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: フォームデザイナの Controls.Add について


(過去ログ 24 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■11031 / inTopicNo.1)  フォームデザイナの Controls.Add について
  
□投稿者/ とるぽん (1回)-(2007/12/05(Wed) 12:53:00)

分類:[C#] 

初めて質問いたします、よろしくお願いします。

ToolStripContainerのように四方を折り畳み可能なコンテナにした
FormPaneContainerというContainerControlを作成しています。

Left/Top/Bottom/Right/ContentというContainerControlを子にします。
挙動そのものは問題ないのですが、Windows フォーム デザイナが作成する
コードに問題があるのです。

本来は作成してほしくない Controls.Add が追加されてしまうのです。

//
// コントロールライブラリ側
//
[Docking(DockingBehavior.AutoDock)]
[Designer(typeof(Suikyo.Forms.Design.FormPaneContainerDesigner))]
public class FormPaneContainer : ContainerControl
{
private FormSidePane m_bottomPane;
private FormSidePane m_leftPane;
private FormSidePane m_rightPane;
private FormSidePane m_topPane;
private FormContentPane m_contentPane = null;

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public FormSidePane LeftPane
{
get { return this.m_leftPane; }
}

private void InitializeComponent()
{
this.SuspendLayout();

this.m_bottomPane = new FormSidePane(this, DockStyle.Bottom);
this.m_contentPane = new FormContentPane(this);
this.m_leftPane = new FormSidePane(this, DockStyle.Left);
this.m_rightPane = new FormSidePane(this, DockStyle.Right);
this.m_topPane = new FormSidePane(this, DockStyle.Top);

this.Controls.Add(this.m_bottomPane);
this.Controls.Add(this.m_contentPane);
this.Controls.Add(this.m_leftPane);
this.Controls.Add(this.m_rightPane);
this.Controls.Add(this.m_topPane);

this.ResumeLayout();
}
}

とし、new FormPaneContainer()時に暗黙的に子コンテナを追加します。

ホストプロジェクトでFormPaneContainerを追加し、作成されたコードを見てみると、

namespace Host
{
partial class Form1
{
private void InitializeComponent()
{
this.formPaneContainer1 = new FormPaneContainer();
// ・・・ //
this.formPaneContainer1.LeftPane.AllowDrop = true;
this.formPaneContainer1.LeftPane.Name = "TopPane";
this.formPaneContainer1.LeftPane.TabIndex = 4;
//
// 問題の箇所
//
this.formPaneContainer1.Controls.Add(this.formPaneContainer1.LeftPane);
// ・・・ //
}
}
}

となり、同じインスタンスを2回も追加しています。

自身で調べてみた限り、同じような挙動をする SplitContainer の内部では
this.Controls.Add を使っておらず、ReadOnlyControllCollectionなるものに追加していました。


子コンテナをコンポーネント化する以外の方法で、
これを解決する方法はないものでしょうか?
引用返信 編集キー/
■11038 / inTopicNo.2)  Re[1]: フォームデザイナの Controls.Add について
□投稿者/ とるぽん (2回)-(2007/12/05(Wed) 16:57:07)
解決しました。

原因はカスタムコントロールデザイナのInitialize内でbase.EnableDesignMode()でした。
これのMSDNヘルプを見ると

MSDNヘルプより引用>>

child で指定された子コントロールは、このコントロール デザイナのコントロールの子です。子コントロールは永続的に直接関与することはありませんが、メイン コントロールのプロパティとして公開される場合は関与します。SplitContainer のようなコントロールを例に説明します。このコントロールには、Panel1 と Panel2 の 2 つのパネルがあります。これらのパネルは、SplitContainer コントロールの読み取り専用の Panel1 プロパティと Panel2 プロパティを介して公開されます。SplitContainer コントロールのデザイナがそれぞれのパネルに対して EnableDesignMode を呼び出し、これによって他のコンポーネントをパネルにドロップできます。ただし、Panel1 と Panel2 のコンテンツを保存するには、SplitContainer コントロール自体でパネルをパブリック プロパティとして公開する必要があります。

<<引用終わり

私自身がどこまで公開してどこまで非公開なのかを正確に把握していないのが原因でした。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -