Динамически отображать элементы управления, определить тип из строки / XML-файла? - PullRequest
1 голос
/ 01 мая 2009

В приложении ASP.NET я хотел бы динамически визуализировать несколько элементов управления с их свойствами, поступающими из XML-документа. Вот кикер: я хочу иметь возможность динамически определять тип управления. Итак, в моем XML-документе у меня есть что-то вроде этого:

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

Я могу заставить все работать нормально, что касается свойств, до тех пор, пока я вручную создаю новый элемент управления в качестве флажка ... но я не могу понять, как сделать его флажком по сравнению с текстовое поле или что-то еще на основе информации XML ...

Ответы [ 2 ]

4 голосов
/ 01 мая 2009

Возможно, вы захотите иметь возможность контролировать выход за пределы типа управления. Мое предложение:

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

Вы также можете добавить ReflectionControlProvider в качестве запасного варианта для незарегистрированных типов и разрешить этому использовать Activator.CreateInstance вместо генерирования исключения при обнаружении неизвестного типа поставщика. Таким образом, вы получаете максимальную гибкость как для конкретного контроля рендеринга, так и для динамического создания.

1 голос
/ 01 мая 2009

Вы можете создать Dictionary<string, Type> допустимых типов или создать экземпляр по имени с помощью Activator.CreateInstance.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...