it is ugly, you could use Reflection to use less methods, but performance could be an issue, try something like (you need to fill the rest for other controls):
void ProcessLabel(XmlTextReader reader, Control c)
{
Label l = new Label();
c.Controls.Add(l);
l.Text = reader.ReadString();
}
void ProcessText(XmlTextReader reader, Control c)
{
TextBox tb = new TextBox();
tb.ID = reader.GetAttribute("name");
if (reader.GetAttribute("multiLine").ToLower()=="true")
tb.TextMode = TextBoxMode.MultiLine;
c.Controls.Add(tb);
//ProcessChildren(reader, tb, "text");
}
void ProcessChildren(XmlTextReader reader, Control c, string strParentTagName)
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.EndElement && reader.LocalName.ToLower() == strParentTagName)
return;
if (reader.NodeType == XmlNodeType.Element)
{
string str = reader.LocalName.ToLower();
switch(str)
{
case "text":
ProcessText(reader, c);
break;
XmlTextReader xtr = new XmlTextReader(....);
while (xtr.Read())
{
if (xtr.NodeType == XmlNodeType.Element)
{
if (xtr.LocalName == "control")
{
Control c = null;
switch(xtr.GetAttribute("type"))
{
case "textbox":