2010-09-10 5 views
2

Ici, j'ai un code utilisant ControlBuilder pour rendre le contrôle DropDown générique.Un DropDown générique implémenté par ControlBuilder a perdu tous les attributs

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

Désolé, le programme est trop long pour être lu avec joie.

La question est, bien que je définissais la propriété EnumType, allowEmpty en classe EnumDropDown. Étant donné que l'objet réel créé par ControlBuilder est EnumDropDown, les valeurs de EnumType, allowEmpty sont toujours null et faux dans l'objet de contrôle. Tous les attributs définis dans .aspx seront perdus!

Je peux lire les valeurs d'attribut de la balise source dans ControlBuilder. Mais je n'ai aucune idée comment puis-je copier les attributs à l'objet de contrôle générique.

quelqu'un peut me donner un indice?

Répondre

1

C'est tellement stupide que j'ai essayé de lire la valeur des propriétés dans le construtor public EnumDropDown(). Bien sûr, les attributs ne sont pas définis puisque l'objet est toujours en train de se construire.

Je renommer le constructeur public EnumDropDown() à la méthode public void OnInit(EventArgs e), et tous les problèmes sont résolus.