2013-04-17 8 views
9

Beim Versuch, eine benutzerdefinierte Datenquelle zu erstellen, die in ASP.NET verwendet werden soll, habe ich eine benutzerdefinierte Datenquellklasse, einen benutzerdefinierten Editor und eine benutzerdefinierte erstellt serialisierbare Klasse.Warum ist meine Designereigenschaft im ASPX nicht serialisiert?

Was ich nicht verstehen kann ist, warum es nicht funktioniert ... obwohl ich wahrscheinlich mehr Attribute als erforderlich (ich habe seit Stunden stöbern und versuchen Dinge), von dem, was ich verstehe, die PersistenceMode(PersistenceMode.InnerProperty) getan haben sollte der Trick ... Auch scheint mir mein Code ähnlich zu Why can't I declare sub-elements (properties) of a UserControl in a WebForm? zu sein.

Der Code funktioniert wie folgt:

[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; } 
} 

Die benutzerdefinierte Editor scheint zu funktionieren: nach Gebrauch, die Eigenschaften in VS richtig aktualisiert.

Doch nach etwas Aktualisierung der Informationen nicht in der ASPX-Datei beibehalten:

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

Was ich erwartet hatte einige Serialisierung innerhalb der Datenquelle war, zum Beispiel:

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

Kann jemand bitte erklären, Warum funktioniert das nicht?

+1

Haben Sie versucht, ohne einige Attribute, zum Beispiel die TypeConverter? –

+0

Ich verstehe nicht, was Sie versuchen zu tun. Im Grunde sagen Sie: Ich habe drei Klassen und sie funktionieren nicht. Was versuchst du zu tun? Was ist dein verhaltenes Verhalten und dein erwartetes Verhalten? Sie erwarten etwas Serialisierung in der Datenquelle? Serialisierung in einer Klasse? Normalerweise erfolgt die Serialisierung in einer Text- oder Binärdatei. Meine nächste Frage wäre also: Welche Datei? –

+0

Nun, im Grunde versuche ich einen benutzerdefinierten Editor für die 'ResultRequest' Klasse zu erstellen. Die Datenquelle selbst funktioniert, ich kann es nur nicht von dem ASPX anstelle von dem Code dahinter konfiguriert werden. Die TypeConverter sind da, weil die Standard-Serialisierung (zu Ihrem ASPX-XML) nicht funktioniert - z. während ich weiß, wie man das 'object []' serialisiert, tut der Designer das nicht, also wollte ich ihm sagen, wie das geht. Dafür ist der Editor auch da. Ja, ich habe versucht, Attribute stundenlang hinzuzufügen und zu entfernen, um zu verstehen, wie es funktioniert (Fazit: Es funktioniert nicht und ich verstehe es nicht). – atlaste

Antwort

1

Bitte nehmen Sie sich einen Blick auf meine Probe ist es weniger komplex, so wäre es einfacher zu verstehen: Kontrolle

erste Elternteil (in Ihrem Fall diese Datasource wäre):

[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; } 
    } 
} 

Beachten Ich habe setze ChildrenAsProperties auf false. Und hier ist das Kind, Definition, 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; 
     } 
    } 
} 

nun innerhalb Designer kann ich TabContainer wie folgt erklären:

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

Und schließlich untergeordneten Steuerelemente hinzufügen, die Zustand erhalten:

 <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> 

Mit freundlichen Grüßen !

+0

Danke, aber ich denke, es ist nicht wirklich eine Lösung: das Problem besteht teilweise darin, dass das 'object []' und 'Type' serialisiert werden müssen. 'IList ' mit 'T' ist ein serialierbarer Typ serialisierbar und arbeitet daher mit' PersistenceMode', während mein Beispiel nicht funktioniert. Ich habe meistens Probleme, all diese Attribute zu kombinieren und zu verstehen, wie man alles zusammenfügt ... Vielleicht, wenn du dein Beispiel ein bisschen komplexer machst, wäre es vergleichbar? – atlaste

Verwandte Themen