SkinID dans le code derrière
Question
est-il possible de changer SkinID en CodeBehind? Je l'ai essayé pendant la prise d'autres biens, mais il ne fonctionne pas. La peau est pas appliquée.
public GlobalImageButtonType Skin {
get { return _skin; }
set
{
_skin = value;
this.SkinID = _skin.ToString();
this.CommandName = _skin.ToString();
LoadDefaultValues();
}
}
J'ai aussi essayé de page.contols throught en boucle, mais l'événement est page_onpreinit collection de contrôles vide.
Est-il possible de changer la SkinID ailleurs que dans la page ASPX?
Merci
La solution
SkinID ne peut être modifié par programme ou avant onPreInit - votre seule option pour lancer ce pour un contrôle est dans la page de onPreInit .
Dans des circonstances normales, .Controls devrait être disponible à ce stade.
Dans certains cas, vous avez besoin du travail autour suivante pour .master pages:
/*
* HACK: need to ensure master controls are instantiated first.
* */
MasterPage root = this.Master;
while (root.Master != null)
root = root.Master;
InvokeControlPreInit(Controls);
Vous pouvez maintenant avoir des contrôles qui ont besoin d'écorcher mettre en œuvre une interface (IRuntimeSkinableControl) qui leur permet d'attribuer leurs propres peaux:
private void InvokeControlPreInit(ControlCollection controls)
{
foreach (Control control in controls)
{
IRuntimeSkinableControl skinableControl;
if (null != (skinableControl = control as IRuntimeSkinableControl))
skinableControl.OnPreInit();
if (string.IsNullOrEmpty(control.SkinID) && control.Controls.Count > 0)
InvokeControlPreInit(control.Controls);
}
}
Le contrôle s'appliquerait comme ceci:
public class UserControl : System.Web.UI.UserControl, IRuntimeSkinableControl
{
public virtual void OnPreInit()
{
//assign this.SkinID
}
}