2011-01-01 9 views
2

Wie wird nur das Layout (Vorlage) des CreateUserWizard-Steuerelements programmgesteuert geändert? Ich würde ein anderes Layout definieren (ohne die schreckliche Tabelle zu verwenden), aber weiterhin die gesamte Ereignisbehandlung und die Erstellung des Benutzers des CreateUserWizard-Steuerelements verwenden. Nur als Referenz funktioniert der folgende Code nicht und erzeugt ein unerwartetes Ergebnis, das meine Vorlage überhaupt nicht darstellt. Die Methode "InstantiateIn" der ITemplate wird nicht aufgerufen.Wie kann das Layout des CreateUserWizard-Steuerelements geändert werden?

public partial class b : System.Web.UI.Page 
    { 
     protected void Page_Init(object sender, EventArgs e) 
     { 
      CreateUserWizard createUserWizard = new CreateUserWizard(); 
      createUserWizard.CreateUserStep.ContentTemplate = new Template(); 
      Panel1.Controls.Add(createUserWizard); 
     } 
    } 

    public class Template : ITemplate 
    { 
     void ITemplate.InstantiateIn(Control container) 
     { 
      container.Controls.Add(new TextBox() { ID = "UserName" }); 
      container.Controls.Add(new TextBox() { ID = "Password" }); 
      container.Controls.Add(new TextBox() { ID = "ConfirmPassword" }); 
      container.Controls.Add(new TextBox() { ID = "Email" }); 
      container.Controls.Add(new PlaceHolder() { ID = "ErrorMessage" }); 
     } 
    } 
} 
+1

Gibt es einen Grund, es programmatisch hinzuzufügen oder nur um das Tabellenformat loszuwerden? Sie können das Layout in Markup nach Ihren Bedürfnissen anpassen. Und mit 4.0 asp.net rendert es nicht mehr als Tabelle. – gbs

+1

@gbs: Danke für Ihren Vorschlag, aber es gibt keine Mark-up, weil das Steuerelement in einer vorkompilierten DLL endet. Außerdem versuche ich nicht nur, die Tabelle loszuwerden, sondern programmiere das ContentTemplate programmatisch aus einer geparsten XML-Datei. Das Layout wird also sehr variabel sein. Ich habe einen ähnlichen Ansatz für das Login-Steuerelement verwendet und das funktioniert perfekt. Das Login-Steuerelement ruft jedoch die InstantiateIn-Methode der ITemplate auf, während der CreateUserWizard dies nicht tut. – Bazzz

Antwort

2

Ich habe keine Ahnung, warum das funktioniert, aber es funktioniert:

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     CreateUserWizard createUserWizard = new CreateUserWizard(); 

     /* Difference Starts Here */ 
     CreateUserWizardStep createUserWizardStep = new CreateUserWizardStep(); 
     createUserWizardStep.ContentTemplate = new Template(); 
     createUserWizard.WizardSteps.Add(createUserWizardStep); 
     /* End Difference */ 

     Panel1.Controls.Add(createUserWizard); 
    } 
} 

public class Template : ITemplate 
{ 
    void ITemplate.InstantiateIn(Control container) 
    { 
     container.Controls.Add(new TextBox() { ID = "UserName" }); 
     container.Controls.Add(new TextBox() { ID = "Password" }); 
     container.Controls.Add(new TextBox() { ID = "Question" }); 
     container.Controls.Add(new TextBox() { ID = "Answer" }); 
     container.Controls.Add(new TextBox() { ID = "ConfirmPassword" }); 
     container.Controls.Add(new TextBox() { ID = "Email" }); 
     container.Controls.Add(new PlaceHolder() { ID = "ErrorMessage" }); 
    } 
} 

Was ich tat, war eine Create Kontrolle zu einer Seite hinzuzufügen, hinzugefügt, um eine leere Content, und die Anweisungen für debugging generated ASP.NET code zu Reverse Engineering, was der ASP.NET-Code-Generator tut.

+0

Vielen Dank für Ihren Vorschlag Greg, aber ich glaube, ich habe etwas ähnliches versucht und es gibt eine Fehlermeldung, dass der CreateUserWizard nur 1 CreateUserWizardStep haben kann. Der CreateUserWizard.CreateUserStep ist auch schreibgeschützt, sodass Sie keinen neuen erstellen und den aktuellen ersetzen können. – Bazzz

+0

Nun, Worst-Case-Szenario können Sie die gleichen Schritte mit dem generierten Code durchlaufen, um herauszufinden, was asp.net tut, damit es funktioniert. – Greg

+0

Ich werde einen Blick in den Artikel "Debuggen generierten ASP.net-Code" werfen. Danke für den Link. – Bazzz

Verwandte Themen