none
ユーザコントロールで内在コントロールのプロパティ公開方法 RRS feed

  • 質問

  • 現在、UpdatePanelにDropDownListがひとつ含まれた
    ユーザコントロールを作成しています。

    http://social.msdn.microsoft.com/Forums/ja/csharpgeneralja/thread/429acc52-bdec-420a-83ec-b1656332e054
    こちらのスレッドを参考にコントロールの作成を進め、
    UpdatePanelのプロパティを外部に公開するために下記のようなコードを記述しました。

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public UpdatePanel UserUpdatePanel
    {
        get
        {
            return UpdatePanel1;
        }
    }

    が、Triggersプロパティが公開されませんでした。

    他にもいろいろこねくり回してみましたが、
    Triggersプロパティを公開させることができませんでした。

    公開するにはどうしたらよいでしょうか?

    2012年9月7日 4:43

回答

  • trapemiya さんがレスされているようにユーザーコントロールでは、プロパティの設定などにおけるビジュアルデザインツールのサポートにも制限があって、望むようなことができません。カスタムコントロールならうまく行くはずです。

    > だとすると難しそうですね・・・。

    そんなに難しくはなくて、クラスファイルを App_Code フォルダに配置して、それに UpdatePanel を継承したクラスを定義してやればいいはずです(別プロジェクトとして作って dll として bin フォルダに配置しても OK です)。

    UpdatePanel.Triggers プロパティは何もしなくても Visual Studio のプロパティウィンドウからコレクションエディターを開いて編集できます。UpdatePanel に配置する DropDownList の Items プロパティはそのままでは編集できませんが、以下のようにすれば可能です。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI;
    using System.ComponentModel;
    using System.Drawing;
    
    namespace MyCustomControl
    {
        [ParseChildren(true)]
        public class MyUpdatePanel : UpdatePanel
        {
            private DropDownList _ddl = new DropDownList();
    
            public MyUpdatePanel()
            {
                this.ContentTemplateContainer.Controls.Add(_ddl);
            }
    
            [PersistenceMode(PersistenceMode.InnerProperty)]
            public ListItemCollection Items
            {
                get
                {
                    return _ddl.Items;
                }
            }
        }
    }

    2012年9月8日 7:51

すべての返信

  • setを追加しても同じでしょうか?
    2012年9月7日 4:52
  • 下記のようなコードということでしょうか?
    であれば特に変化なくダメでした。

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public UpdatePanel UserUpdatePanel
    {
        get
        {
            return UpdatePanel1;
        }
        set
        {
            UpdatePanel1 = value;
        }
    }

    2012年9月7日 5:06
  • すみません。試してみたらsetはなくてもいけました。

    以下手順。

    1.新規のASP.NETWebアプリケーションを作成。

    2.Webユーザーコントロールの追加。

    3.2にUpdatePanel、DropDownList配置。

    4.ぬこさんの書かれたプロパティを記述。

    5.Default.aspxに下記のコードを記述

    <%@ Register tagPrefix="ucl" tagName="User" src="User.ascx" %>
    
    
    <p>
            <ucl:User ID = "User" runat="server" />
    <p>

    6.Default.aspx.csで

    this.User.UserUpdatePane.Triggers.

    とするとプロパティがみえます。

    環境はVS2010、Win7です。

    2012年9月7日 7:15
  • >764さん
    わざわざ、確認していただいてありがとうございます。

    が、私の説明不足でした。
    私の望んでいることは、私が最初に提示したコードで
    デザイナ上からアクセスできるUpdatePanelのプロパティを
    ユーザコントロールでも公開しかつデザイナからアクセスできることです。

    ところが、最初のコードではいくつかのプロパティは
    デザイナからアクセスできるようになりますが、
    肝心のTriggersプロパティはデザイナ上に表示されません。
    (下の図を参照)

    このTriggersプロパティをエディタ付きで公開することが目的となります。
    引き続き、ご存知のかたいらっしゃいましたらお力添えお願い致します。

    2012年9月7日 7:35
  • 以下によると制限があるので、難しいかもしれませんね・・・。海外の掲示板でも同様の質問がいくつかあったのですが、いずれも解決に至っていませんでした。

    Web ユーザー コントロールまたは Web カスタム コントロールの選択に関する推奨事項
    http://msdn.microsoft.com/ja-jp/library/cc437704(v=vs.71).aspx

    私はあまり経験がないのですが、カスタムコントロールとして作成するとうまく行くかもしれません。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年9月7日 8:23
    モデレータ
  • >trapemiyaさん
    そうなんですか・・・。
    だとすると難しそうですね・・・。

    ありがとうございました。
    カスタムコントロールの方を検討してみます。

    とは言え、一度も作ったことないんですよね・・・

    2012年9月7日 9:06
  • trapemiya さんがレスされているようにユーザーコントロールでは、プロパティの設定などにおけるビジュアルデザインツールのサポートにも制限があって、望むようなことができません。カスタムコントロールならうまく行くはずです。

    > だとすると難しそうですね・・・。

    そんなに難しくはなくて、クラスファイルを App_Code フォルダに配置して、それに UpdatePanel を継承したクラスを定義してやればいいはずです(別プロジェクトとして作って dll として bin フォルダに配置しても OK です)。

    UpdatePanel.Triggers プロパティは何もしなくても Visual Studio のプロパティウィンドウからコレクションエディターを開いて編集できます。UpdatePanel に配置する DropDownList の Items プロパティはそのままでは編集できませんが、以下のようにすれば可能です。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI;
    using System.ComponentModel;
    using System.Drawing;
    
    namespace MyCustomControl
    {
        [ParseChildren(true)]
        public class MyUpdatePanel : UpdatePanel
        {
            private DropDownList _ddl = new DropDownList();
    
            public MyUpdatePanel()
            {
                this.ContentTemplateContainer.Controls.Add(_ddl);
            }
    
            [PersistenceMode(PersistenceMode.InnerProperty)]
            public ListItemCollection Items
            {
                get
                {
                    return _ddl.Items;
                }
            }
        }
    }

    2012年9月8日 7:51
  • >SurferOnWww さん

    なるほど・・・、この程度の要件であればコードも複雑ではないんですね。

    ありがとうございました。これを元に検討させて頂きます。

    2012年9月11日 5:56