none
ユーザコントロールにおける内在コントロールのプロパティ公開について RRS feed

  • 質問

  • 現在ユーザコントロールを作成しております。
    内在コントロールのプロパティについてのご質問です。
    目的としましては、複数ある内在コントロールの各プロパティを、
    コーディングなし、または極めて少ないコーディング量で公開し、
    コントロールを使用する際にはデザイナ上でプロパティを設定可能とする事です。

    内在コントロールがいくつかある場合、それらのプロパティを公開するには
    ①カスタムプロパティをコーディングする
    ②内在コントロールのModifiersプロパティをPublicにする
    の2つの方法があるかと思います。

    ①の方法に関してはコーディング量が非常に多くなってしまうので、
    工数の制約上避けたいと思っております。
    ②の方法に関しては、半分は目的が達成できています。
    半分という理由は、内在コントロールのプロパティは設定できますが、
    デザイナ上では変更できないからです。

    そこで、下記の様に内在コントロール自体をプロパティで取得可能としました。
    /// <summary>
    /// ラベルコントロールを取得します。
    /// </summary>
    public System.Windows.Forms.Label Label
    {
        set
        {
            this.LabelControl = value;
        }
        get
        {
            return this.LabelControl;
        }
    }
    その結果、コントロール使用時にデザイナ上で内在コントロールのプロパティを
    変更できるようになりました、と思ったのですが変更結果が*.Designer.csに反映されません。
    上記ソースでは内在コントロールそのものをプロパティで公開していますが、
    下記の様にControlCollectionで公開しても結果は同様でした。
    public ControlCollection MyControls
    {
        get
        {
            return this.Controls;
        }
    }

    長くなってしまいましたが、冒頭で述べましたように、内在コントロールの全プロパティ
    を極少ないコーディング量で公開し、デザイナ上で設定可能にするには
    どういった方法が考えられますでしょうか?または不可能なのでしょうか?
    以上、よろしくお願いいたします。




    2007年5月25日 6:02

回答

  • [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] ですね

    ユーザーコントロールの作成は私のページで恐縮ですが基本を書いてあります。

    http://mnow.wankuma.com/index2f.html

    http://mnow.wankuma.com/cs_usercontrol5.html

     

    マイクロソフトのページもあります。

    本当はこの下をじっくり読むのが良いんですが。

    http://msdn2.microsoft.com/ja-jp/library/37899azc(VS.80).aspx

    ここにこの件は書かれています。

    http://msdn2.microsoft.com/ja-jp/library/a19191fh(VS.80).aspx


    /// <summary>
    /// ラベルコントロールを取得します。

    /// </summary>
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

    public System.Windows.Forms.Label Label
    {
        set
        {
            this.LabelControl = value;
        }
        get
        {
            return this.LabelControl;
        }
    }


     

    私としてはこのやり方はお勧めしていません。

    こういうやり方でラベルコントロール全体を出してしまうとユーザーコントロールでいじってほしくない部分も、

    変更されてしまう危険性があり後々トラブルの種です。

     

    個人的に自分だけが使う場合を除いて仕事ではやらないほうがいいと思います。

    ユーザーコントロールとしてバグの範囲の可能性が絞れないからです。

    2007年5月25日 7:11
  • えムナウ様、早速のご教授ありがとうございます。
    教えていただきましたサイト、大変参考になります。
    まだ全て目を通しておりませんが、これからじっくり拝見させていただきます。

    また、ご教授いただきました下記ソースで問題を無事解決する事ができました。
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    えムナウ様の仰るように推奨される作りではないですが・・・。

    この度はありがとうございました。
    大変感謝しております。


    2007年5月25日 8:34
  • [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    によってデザイナ上からプロパティの変更が可能にはなりました。
    プロパティを設定し実行すると設定値が反映されています。
    しかし、その後再度デザイナでプロパティを設定しても反映されません。
    初回設定値のみが有効となってしまうようです。

    調査しているのですが、いまだに解決できておりません。
    再度ご教授お願いいたします。

    2007年5月29日 10:15
  • うちではそんなことはありません。

    貼り付けたフォームの designer.cs InitializeComponent() を確認してください。

    2007年5月29日 10:26
  • えムナウ様、お世話になっております。
    大変申し訳ございませんが、私の大きな勘違いでした・・・。

    今回問題となっていたプロパティは新たに追加したカスタムプロパティで、
    内在コントロールではないにも関わらず、
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    をしておりました。
    というより全てのプロパティに付けていました・・・。
    意味を正しく理解していなかったためです。

    無事解決いたしました。
    本当に度々ありがとうございました。
    2007年5月30日 0:26

すべての返信

  • [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] ですね

    ユーザーコントロールの作成は私のページで恐縮ですが基本を書いてあります。

    http://mnow.wankuma.com/index2f.html

    http://mnow.wankuma.com/cs_usercontrol5.html

     

    マイクロソフトのページもあります。

    本当はこの下をじっくり読むのが良いんですが。

    http://msdn2.microsoft.com/ja-jp/library/37899azc(VS.80).aspx

    ここにこの件は書かれています。

    http://msdn2.microsoft.com/ja-jp/library/a19191fh(VS.80).aspx


    /// <summary>
    /// ラベルコントロールを取得します。

    /// </summary>
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

    public System.Windows.Forms.Label Label
    {
        set
        {
            this.LabelControl = value;
        }
        get
        {
            return this.LabelControl;
        }
    }


     

    私としてはこのやり方はお勧めしていません。

    こういうやり方でラベルコントロール全体を出してしまうとユーザーコントロールでいじってほしくない部分も、

    変更されてしまう危険性があり後々トラブルの種です。

     

    個人的に自分だけが使う場合を除いて仕事ではやらないほうがいいと思います。

    ユーザーコントロールとしてバグの範囲の可能性が絞れないからです。

    2007年5月25日 7:11
  • えムナウ様、早速のご教授ありがとうございます。
    教えていただきましたサイト、大変参考になります。
    まだ全て目を通しておりませんが、これからじっくり拝見させていただきます。

    また、ご教授いただきました下記ソースで問題を無事解決する事ができました。
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    えムナウ様の仰るように推奨される作りではないですが・・・。

    この度はありがとうございました。
    大変感謝しております。


    2007年5月25日 8:34
  • [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    によってデザイナ上からプロパティの変更が可能にはなりました。
    プロパティを設定し実行すると設定値が反映されています。
    しかし、その後再度デザイナでプロパティを設定しても反映されません。
    初回設定値のみが有効となってしまうようです。

    調査しているのですが、いまだに解決できておりません。
    再度ご教授お願いいたします。

    2007年5月29日 10:15
  • うちではそんなことはありません。

    貼り付けたフォームの designer.cs InitializeComponent() を確認してください。

    2007年5月29日 10:26
  • えムナウ様、お世話になっております。
    大変申し訳ございませんが、私の大きな勘違いでした・・・。

    今回問題となっていたプロパティは新たに追加したカスタムプロパティで、
    内在コントロールではないにも関わらず、
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    をしておりました。
    というより全てのプロパティに付けていました・・・。
    意味を正しく理解していなかったためです。

    無事解決いたしました。
    本当に度々ありがとうございました。
    2007年5月30日 0:26