2009-03-19 2 views
0

Ich habe ein zusammengesetztes datengebundenes Steuerelement, das ein IBindableTemplate hostet und dynamisch ein Markup basierend auf einer Bedingung in das Steuerelement lädt. Jetzt, wenn diese untergeordneten Steuerelemente in das Verbundsteuerelement geladen werden und das Postback vorhanden ist, verliere ich den Sichtstatus der untergeordneten Steuerelemente. Gibt es eine Möglichkeit, den Viewstatus der Child-Controls auf dem Postback zu speichern?Wie wird der Ansichtszustand von untergeordneten Steuerelementen gehandhabt, die in einem benutzerdefinierten Verbundsteuerelement auf eine bindbare Vorlage platziert wurden?

Ich auch ref. zu der Erklärung von Scott unter Verwendung http://scottonwriting.net/sowblog/posts/2129.aspx; aber nutzlos.

Antwort

0

Ihr theoretischer Code ist nur mit einem großen Unterschied fast in der Nähe von meiner Situation, dass ich meine Template-Klasse nicht eher von IBindable als solche verlängern Ich stelle die Steuerelemente für die Vorlagen im Markup selbst zur Verfügung, was die Voraussetzung ist.

Scott auch, macht deutlich, dass, wenn wir die Kontrollen in der Template wie Sie

getan haben
  #region ITemplate Members 
     public void InstantiateIn(Control container) 
     { 
      Label label = new Label(); 
      label.Text = "Label"; 
      container.Controls.Add(label); 

      TextBox textbox = new TextBox(); 
      container.Controls.Add(textbox); 
     } 
     #endregion 

dann der Ansichtszustand wird automatisch auf jedem Postbacks beibehalten werden. Alles, was ich brauche, ist, dass meine Vorlagen im Markup instanziiert werden und der Ansichtsstatus beim Postback erhalten bleibt und ich den Status der Kontrolle abrufen kann, auch wenn ich die Vorlage mit einigen anderen Daten neu initiiere.

0

Es gibt nicht genügend Informationen. Wann erstellen Sie Steuerelemente? Wann fügen Sie sie zur Controls-Sammlung hinzu? Was ist Bedingung und ändert sich das beim Postback?

Der Viewstatus wird automatisch am Ende des Seitenzyklus gespeichert (Postback oder nicht), da die Steuerelemente zur richtigen Zeit hinzugefügt werden.

Wenn Sie später Kontrollen hinzufügen, in einigen Fällen nach der Initialisierung, ist es zu spät.

aktualisieren

Ohne Code ist es schwer zu erraten, wo der Bruch nach unten stattfindet. Untersuchen wir einen Repeater mit einer benutzerdefinierten Vorlage, die die Steuerelemente unter bestimmten Bedingungen laden kann. Dieses Beispiel funktioniert, aber es würde fehlschlagen, wenn die Vorlagenzuweisung auf Page_Load ausgeführt wurde. Ist das Ihrer Situation ähnlich?

Form:

<div> 
    <asp:Repeater ID="repeater" runat="server" /> 
    <asp:Button ID="submitButton" runat="server" Text="Submit" onclick="submitButton_Click" /> 
    <asp:Button ID="postButton" runat="server" Text="PostBack" /> 
</div> 

Code:

public partial class _Default : System.Web.UI.Page 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     repeater.ItemTemplate = new MyTemplate(); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //however, if I was to move repeater.ItemTemplate = new MyTemplate() here 
     //it would not reload the view state 
     if (!IsPostBack) 
     { 
      repeater.DataSource = new int[] { 1, 2, 3, 4, 5 }; 
      repeater.DataBind(); 
     } 
    } 

    protected void submitButton_Click(object sender, EventArgs e) 
    { 
     submitButton.Text = "Do it again"; 
    } 
} 

public class MyTemplate : IBindableTemplate, INamingContainer 
{ 
    #region IBindableTemplate Members 
    public System.Collections.Specialized.IOrderedDictionary ExtractValues(Control container) 
    { 
     OrderedDictionary dictionary = new OrderedDictionary(); 
     return dictionary; 
    } 
    #endregion 

    #region ITemplate Members 
    public void InstantiateIn(Control container) 
    { 
     Label label = new Label(); 
     label.Text = "Label"; 
     container.Controls.Add(label); 

     TextBox textbox = new TextBox(); 
     container.Controls.Add(textbox); 
    } 
    #endregion 
} 
+0

Die Steuerelemente werden in Markup platziert und basierend auf einer Geschäftslogik werden sie in der Vorlage instanziiert. Der Ansichtszustand wird nicht geladen, da die Vorlage bei jedem Postback erneut mit einem neuen Satz von Steuerwerten instanziiert wird und der vorherige Ansichtszustand verloren geht. –

+0

Ich kann nicht sagen, ohne den Code zu betrachten. Ich habe meine Antwort bearbeitet, um die theoretische Situation zu veranschaulichen. Ich weiß nicht, ob es dir ähnlich ist. – Ruslan