Общий DropDown, реализованный ControlBuilder, потерял все атрибуты. - PullRequest
2 голосов
/ 10 сентября 2010

Здесь у меня есть код, использующий ControlBuilder, чтобы сделать элемент управления DropDown универсальным.

[ControlBuilder(typeof(EnumDropDownControlBuilder))]
public class EnumDropDown : DropDownList {
    private string _enumType;
    private bool _allowEmpty;

    public string EnumType {
        get { return _EnumType; }
        set { _EnumType = value; }
    }

    public bool AllowEmpty {
        get { return _allowEmpty; }
        set { _allowEmpty= value; }
    }
}

public class EnumDropDown<T> : EnumDropDown where T : struct {
    public EnumDropDown() {
        this.Items.Clear();
        if (AllowEmpty) this.Items.Add(new ListItem("", "__EMPTY__"));
        foreach (string name in Enum.GetNames(typeof(T))) {
            Items.Add(name);
        }
    }

    public new T SelectedValue {
        get {
            if (IsEmpty) throw new NullReferenceException();
            return (T)Enum.Parse(typeof(T), base.SelectedValue, true);
        }
        set { base.SelectedValue = Enum.GetName(typeof(T), value); }
    }

    public bool IsEmpty {
        get {
            return base.SelectedValue == "__EMPTY__";
        }
        set { base.SelectedValue = Enum.GetName(typeof(T), value); }
    }
}

public class EnumDropDownControlBuilder : ControlBuilder {
    public override void Init(TemplateParser parser, ControlBuilder parentBuilder, Type type, string tagName, string id, IDictionary attribs) {

        string enumTypeName = (string)attribs["EnumType"];
        Type enumType = Type.GetType(enumTypeName);
        if (enumType == null) {
            throw new Exception(string.Format("{0} cannot be found or is not an enumeration", enumTypeName));
        }
        Type dropDownType = typeof(EnumDropDown<>).MakeGenericType(enumType);
        base.Init(parser, parentBuilder, dropDownType, tagName, id, attribs);
    }
}

Извините, программа слишком длинная, чтобы читать ее весело.

Вопрос в том, что я определил свойство EnumType , AllowEmpty в классе EnumDropDown .Поскольку реальный объект, созданный ControlBuilder, равен EnumDropDown , значения EnumType , AllowEmpty всегда null и false в объекте управления.Все атрибуты, установленные в .aspx, будут потеряны!

Я могу прочитать значения атрибутов исходного тега в ControlBuilder.Но я понятия не имею, как я могу скопировать атрибуты в общий объект управления.

кто-нибудь может дать мне подсказку?

1 Ответ

1 голос
/ 13 сентября 2010

Это так глупо, что я попытался прочитать значение свойств в construtor public EnumDropDown().Конечно, атрибуты не устанавливаются, так как объект все еще создается.

Я переименовываю конструктор public EnumDropDown() в метод public void OnInit(EventArgs e), и все проблемы исправлены.

...