2009-05-01 2 views
1

In einer ASP.NET-Anwendung möchte ich dynamisch mehrere Steuerelemente mit ihren Eigenschaften aus einem XML-Dokument rendern. Hier ist der Kicker: Ich möchte in der Lage sein, den Steuerungstyp dynamisch zu bestimmen. Also, in meinem XML-Dokument, ich habe so etwas wie dies:Steuerelemente dynamisch rendern, Typ aus String/XML-Datei bestimmen?

<control> 
    <id>myControl1</id> 
    <type>CheckBox</type> 
    <text>Text For This Control</text> 
    </control> 

Ich kann alles bekommen gut zu funktionieren, soweit Eigenschaften gehen, solange ich manuell die neue Steuerung als Checkbox instanziiert ... aber Ich kann nicht herausfinden, wie man es zu einem Kontrollkästchen macht, im Gegensatz zu einem Textfeld oder was auch immer basierend auf den XML-Informationen ...

Antwort

4

Wahrscheinlich möchten Sie in der Lage sein, die Ausgabe über den Kontrolltyp hinaus zu steuern. Mein Vorschlag:

public interface IControlProvider { 
    public Control GetControl(XmlElement controlXml); 
}; 

public class ControlProviderFactory : IControlProvider { 
    private Dictionary<string,IControlProvider> providers = new Dictionary<string,IControlProvider>(); 

    public ControlProviderFactory() { 
     //Add concrete implementations of IControlProvider for each type 
    } 

    public Control GetControl(XmlElement controlXml) { 
     string type = (controlXml.SelectSingleNode("type") as XmlElement).InnerText; 
     if(!providers.ContainsKey(type) throw new Exception("No provider exists for " + type); 
     return providers[type].GetControl(controlXml); 
    } 
} 

Sie könnten auch einen ReflectionControlProvider als Ausweich für nicht registrierten Typen und lassen Sie diese Anwendung Activator.CreateInstance statt wirft eine Ausnahme hinzu, wenn eine unbekannte Anbieter Art zu stoßen. Auf diese Weise erhalten Sie maximale Flexibilität für die Steuerung des Renderings und der dynamischen Erstellung.

+1

+1 nette, flexible Antwort. Ich denke jedoch, dass es manchmal übertrieben ist. –

+0

Vor etwa zwei Monaten hätte ich zugestimmt. Aber seit ich diese Art der Codierung benutzt habe, um das Open-Closed-Prinzip zu erfüllen, kann ich nicht verstehen, warum ich die Dinge nicht immer so aufgebaut habe. Es ist einfach zu erweitern und Sie laufen kein Risiko, Ihren Code zu brechen, indem Sie ihn ändern, da Sie nie ändern - fügen Sie einfach neue Anbieter hinzu. –

+0

OK, ich bin so weit gekommen, und die Art zu bekommen ist kein Problem mehr ... aber das Zuweisen der anderen Eigenschaften scheint mein neues Problem geworden zu sein ...? Sie haben angedeutet, dass Sie die Ausgabe über den Typ hinaus steuern können. Gibt es noch andere Hinweise, die Sie mir geben könnten, um in die richtige Richtung zu gehen? Vielen Dank für Ihre Hilfe bis jetzt. –

1

Sie könnten eine Dictionary<string, Type> von gültigen Typen oder Sie könnten Instanz mit Namen mit Activator.CreateInstance erstellen.