2009-06-25 18 views
9

異なる外観の入力を対象としていますが、すべて同じ外観と共通の動作を共有する必要があるコントロールをいくつか作成しています。だから、私はUserControlから継承したBaseClassを作成し、すべてのコントロールはBaseClassから継承します。winformsデザイナーで継承されたコントロールにアクセスする方法

しかし、TableLayoutPanelのようなデザイナーでBaseClassのコントロールを追加すると、継承したクラスをデザインするときに、私はそれらにアクセスできなくなります。私はTableLayoutPanelを見ていますが、彼が "保護されていても"私はそれを変更したり、デザイナーを通してコントロールを置くことはできません。私はコードでそれにアクセスするのに問題はありませんが、私はデザイナーを使う能力を失いたくはありません。

今、BaseClassからすべてのコントロールを削除し、継承された各クラスのレイアウトとすべての共通コントロールを追加してから、参照を使用してBaseClass内で操作します。しかし、それはまったく私を満足させるものではありません。継承された保護されたメンバーコントロールでデザイナーを動作させる方法はありますか?

環境:SLaksの提案に答えるためのC#、.NET 3.5は、Visual Studio 2008の

EDIT。私はプロパティを設定しようとしましたが、私はそれらを使用するのに慣れていませんが、動作していないようです。私が試したコードはここにあります:

public partial class UserControl1 : UserControl 
    { 
      public UserControl1() 
      { 
        InitializeComponent(); 
      } 

      public TableLayoutPanel TableLayoutPanel1 
      { 
        get { return tableLayoutPanel1;} 
        set { tableLayoutPanel1 = value;} 
      } 
    } 

    public partial class UserControl2 : UserControl1 
    { 
      public UserControl2() 
      { 
        InitializeComponent(); 
      } 
    } 
+0

TableLayoutPanel自体から継承できますか? – SLaks

+0

もちろん、winformsコントロールから継承した独自のコントロールをいつでも作成できます。私はいくつかのコントロールを実装するためにこれを行いました。しかし、これは私がここで達成しようとしていることではありません。私は内部にいくつかのコントロール(ラベルなど)を持つtablelayoutpanelと、継承したクラスが選択したコントロールでいっぱいになるいくつかの空白スペースを持つコントロールをいくつか持っています。 最後の目標は、これらのコントロールをすべてツールボックスに追加し、デザイナーにドラップ&ドロップして、多くのコントロールを持つフォームを作成し、これらのコントロール全体で共通の動作/レイアウトを作成することです。 – Ksempac

+0

そしてbtwはWinformコントロールを継承してデザイナーを省略します。通常は、コントロールは自分でコントロールを再設計するのではなく、特定の動作のみを実装するためです。 – Ksempac

答えて

11

デザイナで継承されたコントロールからベースコントロールで宣言されたTableLayoutPanelにアクセスしようとすると、WinFormsの「ビジュアル継承」という機能が使用されています。 http://msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx

TableLayoutPanelが継承コントロールでブロックされて表示されます理由です:

残念ながらTableLayoutPanelは、視覚的な継承をサポートしていません。

+0

私はこの問題に直面しました。 FTA:「TableLayoutPanelコントロールを慎重に使用する」 –

+0

はい、これはデッドエンドのようです。私はtablelayoutとデザイナーのC#ソースのほとんどを見つけることができましたが、このコントロールに関連付けられたFlowPanelDesigner.uexファイルが見つからないようです – garaber

0

あなたは自分でベースコントロールを設計する必要があります。コントロールプロジェクトを正常に再構築すると、デザイナに変更が反映されます。メンバーをパブリックにすると、メンバーを編集できますが、変更は維持されません。

+0

基本クラスのTableLayoutPanelの行、列、サイズを設定することは私がしたいことです。しかし、派生クラスを設計しているときにレイアウトにコントロールを追加できないと無意味です。たとえば、私のテーブルレイアウトに空白のセルがあり、デザイナを介して、このセルの派生クラスのそれぞれに異なるコントロールを追加します。 – Ksempac

+0

派生コントロールを設計するときに、ベースコントロールを変更することはできません。とにかく簡単ではありません。空のスペースを公開した場合(例えば、EmptyPanel1、EmptyPanel2、...)、独自のTypeEditorを提供すると、少なくともコントロールを視覚的に設定できるようになります。 しかし、タイプエディタの作成は少しの作業です。 –

1

パネルの定義にこの属性を追加してみてください(これはよく、または助けないかもしれません):

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
+0

いいえ、動作しません。 – Ksempac

+0

フィールドをプライベートにして、その属性を公開する公開プロパティに追加してください。 – SLaks

+0

これはSplitContainerの機能です – SLaks

0

は、あなたのコントロールのためのParentControlDesignerを作るInternalControlDesignerをオーバーライドし、(designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner)を返す試してみてください。 designerHost(IDesignerHost) component.Site.GetService(typeof(IDesignerHost))です。

0

似たような問題を解決するために、基本クラスを独自のDLLに置き、最初にビルドすることを覚えています。私はうわさがありましたが、私はプロジェクトを見つけることができません。ごめんなさい。

関連する問題