2013-04-17 8 views
9

ASP.NETで使用されるはずのカスタムデータソースを作成しようとして、カスタムデータソースクラス、カスタムエディタ、カスタム直列化可能クラス。デザイナーのプロパティがASPXでシリアライズされない理由

私が理解できないのは、それがうまくいかない理由です。私がおそらく必要以上に多くの属性を持っていても(私はブラウジングして何時間も試しています)、PersistenceMode(PersistenceMode.InnerProperty)はトリック...また、私のコードはWhy can't I declare sub-elements (properties) of a UserControl in a WebForm?に似ているようです。次のように

コードは動作します。それを使用した後、VSのプロパティが正しく更新されています

[ParseChildren(true)] 
[PersistChildren(true)] 
public class MyDataSource : DataSourceControl 
{ 
    // [much more irrelevant code...] 

    [Browsable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [MergableProperty(false)] 
    [TypeConverter(typeof(ExpandableObjectConverter))] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    [Editor(typeof(Editors.ResultRequestEditor), typeof(System.Drawing.Design.UITypeEditor))] 
    public ResultRequest Request { get; set; } 
} 

[Serializable] 
[PersistChildren(true)] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
[ParseChildren(true)]  
public class ResultRequest 
{ 
    [Browsable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    public string ColumnName { get; set; } 

    [Browsable(true)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    public Type ColumnType { get; set; } 

    [Browsable(false)] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    public object[] ResultTypeParameters { get; set; } 
} 

カスタムエディタが動作しているようです。しかし

、情報がASPXファイルに保持されていない何かを更新した後:

<cc1:MyDataSource ID="SearchDataSource1" runat="server" ProviderID="MyProvider1"> 
    <Request> 
     // blah 
    </Request> 
</cc1:MyDataSource> 

することは、誰かが説明していただけます:私は、データソース内のいくつかのシリアライズ、例えばでした期待何

<cc1:MyDataSource ID="SearchDataSource1" runat="server" ProviderID="MyProvider1" /> 

なぜこれはうまくいかないのですか?

+1

TypeConvertersなどの属性を付けずに試したことがありますか? –

+0

あなたは何をしようとしているのか分かりません。基本的にあなたは言っている:私は3つのクラスがあり、彼らは動作しません。あなたは何をしようとしていますか?あなたの卑劣な行動と期待される行動は何ですか?あなたは、データソースのいくつかのシリアル化を期待していますか?クラスの直列化?通常、シリアル化はテキストファイルまたはバイナリファイル内で行われます。だから私の次の質問は:どのファイルですか? –

+0

基本的に私は 'ResultRequest'クラス用のカスタムエディタを作ろうとしています。データソース自体は機能していますが、コードの背後にあるコードではなく、ASPXから構成することはできません。 TypeConvertersは、(ASPX XMLへの)デフォルトのシリアル化が機能しないためにそこにあります - f.ex. 'object []'をシリアライズする方法は分かっていますが、デザイナーはそうしないので、私は彼にそのことがどういうかを伝えようとしました。これは編集者のためのものです。はい、私は時間の属性を追加したり削除したりして、どのように動作するかを理解しようとしました(結論:うまくいかず、理解できません)。 – atlaste

答えて

1

理解することが容易になるので、それはそれほど複雑だ、私のサンプルを見てみてください(お使いの場合には、これはデータソースになります)

まず親コントロールを:私が持っている

[ToolboxData("<{0}:TabContainer runat=server></{0}:TabContainer>")] 
[ParseChildren(ChildrenAsProperties = false)] 
[PersistChildren(true)] 
public class TabContainer : Panel, INamingContainer 
{ 

    #region private properties 

    List<TabItem> tabs = new List<TabItem>(); 

    #endregion 

    [Bindable(true)] 
    public event EventHandler TabClick; 

    [Browsable(true)] 
    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public List<TabItem> Tabs 
    { 
     get { return this.tabs; } 
    } 
} 

テイク通知ChildrenAsPropertiesをfalseに設定します。そして、ここで子供の定義がある、のTabItem:

public class TabItem : Panel, IPostBackEventHandler 
{ 


    String clientClick = String.Empty; 

    public event EventHandler Click; 


    [Bindable(true)] 
    [Category("Appearance")] 
    public string Text 
    { 
     get 
     { 
      if (ViewState["Text"] == null) 
      { 
       ViewState["Text"] = ""; 
      } 
      return (string)ViewState["Text"]; 
     } 
     set 
     { 
      ViewState["Text"] = value; 
     } 
    } 
} 

は今、デザイナーの内側に、私はこのようにタブコンテナを宣言することができます。

 <cc1:TabContainer ID="TabContainer1" runat="server" 
     </cc1:TabContainer> 

そして最後に状態を保持する子コントロールを追加します。

 <cc1:TabContainer ID="TabContainer1" runat="server" 
      OnTabClick="TabContainer_TabClick"> 
      <Tabs> 
       <cc1:TabItem ID="Tab1" Text="Hello" runat="server" /> 
       <cc1:TabItem ID="Tab2" Text="World" runat="server" /> 
      </Tabs> 
     </cc1:TabContainer> 

敬具!

+0

ありがとうございます。しかし、実際には解決策ではないと思います。問題の一部は、 'object []'と 'Type'をシリアライズする必要があります。 'IList 'は直列化可能な 'T'型の直列化が可能であるため、' PersistenceMode'では動作しますが、私の例ではそうではありません。私はほとんどすべてのこれらの属性を組み合わせ、それを一緒に接着する方法を理解するのに苦労しています...多分あなたの例を少し複雑にした場合、それは匹敵するでしょうか? – atlaste

関連する問題