Вопрос
есть ли какой-нибудь способ изменить skinId в codeBehind?Я попробовал это во время настройки другого свойства, но это не работает.На кожу не наносится.
public GlobalImageButtonType Skin {
get { return _skin; }
set
{
_skin = value;
this.SkinID = _skin.ToString();
this.CommandName = _skin.ToString();
LoadDefaultValues();
}
}
Я также попробовал выполнить цикл через page.contols, но в событии page_onpreinit коллекция элементов управления пуста.
Можно ли изменить SkinId в другом месте, кроме как на странице aspx?
Спасибо
Решение
СкинИД может быть изменен программно только на или до ОнПреИнит - ваш единственный вариант инициировать это для элемента управления находится в ОнПреИнит.
При нормальных обстоятельствах, .Элементы управления должно быть доступно на этом этапе.
В некоторых случаях вам потребуется следующий обходной путь для .мастер страницы:
/*
* HACK: need to ensure master controls are instantiated first.
* */
MasterPage root = this.Master;
while (root.Master != null)
root = root.Master;
InvokeControlPreInit(Controls);
Теперь у вас могут быть элементы управления, которым требуется скининг, реализующие некоторый интерфейс (IRuntimeSkinableControl), который позволяет им назначать свои собственные скины:
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);
}
}
Элемент управления будет применять это следующим образом:
public class UserControl : System.Web.UI.UserControl, IRuntimeSkinableControl
{
public virtual void OnPreInit()
{
//assign this.SkinID
}
}