0

私は、Subscriptionsというコレクションプロパティを持つASP.Net WebFormsの簡単なカスタムWebコントロールを開発しようとしています。コレクションエディタはVS 2013のデザインビューでカスタムWebコントロールマークアップのエントリを永続化していませんか?

コントロールプロジェクトを正常にコンパイルし、問題なくツールボックスからaspxページに追加できます。私はその後、コレクションエディタの[OK]ボタンをクリックしたときに、私は入力複数のサブスクリプションは、私は行くことができます2013年

のVisual Studioのデザインビュー内のコレクションエディタを使用してSubscriptionsプロパティのエントリを追加するとき

問題があります私は瞬間にいくつかのエントリを入力したにもかかわらず、デザインビューのSubscriptionsプロパティに戻ります。

ASPXでカスタムコントロールのマークアップ

<cc1:WebControl1 ID="WebControl1" runat="server"></cc1:WebControl1> 

質問:デザインビューでコントロールのマークアップに表示されないためにコレクションを引き起こしている私のコードで正しくないですか?

カスタムWebコントロールコード

namespace WebControl1 
{ 
    [ToolboxData("<{0}:WebControl1 runat=\"server\"> </{0}:WebControl1>")] 
    [ParseChildren(true)] 
    [PersistChildren(false)] 
    public class WebControl1 : WebControl 
    { 
     [Bindable(true)] 
     [Category("Appearance")] 
     [DefaultValue("")] 
     [Localizable(true)] 
     public string Text 
     { 
      get 
      { 
       String s = (String)ViewState["Text"]; 
       return ((s == null) ? "[" + this.ID + "]" : s); 
      } 

      set 
      { 
       ViewState["Text"] = value; 
      } 
     } 
     [ 
     Category("Behavior"), 
     Description("The subscriptions collection"), 
     DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), 
     Editor(typeof(SubscriptionCollectionEditor), typeof(UITypeEditor)), 
     PersistenceMode(PersistenceMode.InnerDefaultProperty) 
     ] 
     public List<Subscription> Subscriptions { get; set; } 

     protected override void RenderContents(HtmlTextWriter output) 
     { 
      output.Write(Text); 
     } 
    } 
} 


[TypeConverter(typeof(ExpandableObjectConverter))] 
public class Subscription 
{ 
    private string name; 
    private decimal amount; 


    public Subscription() 
     : this(String.Empty, 0.00m) 
    { 
    } 

    public Subscription(string nm, decimal amt) 
    { 
     name = nm; 
     amount = amt; 
    } 

    [ 
    Category("Behavior"), 
    DefaultValue(""), 
    Description("Name of subscription"), 
    NotifyParentProperty(true), 
    ] 
    public String Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    [ 
    Category("Behavior"), 
    DefaultValue("0.00"), 
    Description("Amount for subscription"), 
    NotifyParentProperty(true) 
    ] 
    public decimal Amount 
    { 
     get 
     { 
      return amount; 
     } 
     set 
     { 
      amount = value; 
     } 
    } 
    } 

public class SubscriptionCollectionEditor : System.ComponentModel.Design.CollectionEditor 
{ 
    public SubscriptionCollectionEditor(Type type) 
     : base(type) 
    { 
    } 

    protected override bool CanSelectMultipleInstances() 
    { 
     return false; 
    } 

    protected override Type CreateCollectionItemType() 
    { 
     return typeof(Subscription); 
    } 
} 

答えて

0

私は2つの変更を、以下のことによって、問題を解決することができました。

  1. .Net Frameworkでは自動的に適切なエディタが表示されるので、コレクションはList型であるため、エディタを指定する必要はありません。したがって、この属性は不要です。Editor(typeof(SubscriptionCollectionEditor), typeof(UITypeEditor))
  2. Subscriptionsのセッターは削除する必要があり、以下のコードのようにgetだけが存在する必要があります。セッターを使用する場合は、2番目のコードスニペットのように使用する必要があります。 カスタムWebコントロールでは、自動取得および自動設定をコレクションプロパティとともに使用しないでください。

コレクションプロパティの最終的なコードは以下のようになります。もう1つはセッター

なしで動作し、2013年

コードVS設計時に後でそれに戻ったときに、その後のコレクションは消えません。

private List<Subscription> list = null; [Category("Behavior"), Description("The subscriptions collection"), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), PersistenceMode(PersistenceMode.InnerDefaultProperty) ] public List<Subscription> SubscriptionList { get { if (lists == null) { lists = new List<Subscription>(); } return lists; } } 

[Category("Behavior"), 
Description("The subscriptions collection"),    
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), 
PersistenceMode(PersistenceMode.InnerDefaultProperty) 
] 
public List<Subscription> SubscriptionList 
{ 
    get 
    { 
     object s = ViewState["SubscriptionList"]; 
     if (s == null) 
     { 
      ViewState["SubscriptionList"] = new List<Subscription>(); 
     } 
     return (List<Subscription>) ViewState["SubscriptionList"]; 
    } 
    set 
    { 
     ViewState["SubscriptionList"] = value; 
    } 
} 
セッターで動作するコード
関連する問題