2009-06-07 44 views
0

有沒有辦法在codeBehind中更改skinId? 我在設置其他屬性期間嘗試過,但它不起作用。皮膚不適用。CodeBehind中的SkinID

public GlobalImageButtonType Skin { 
      get { return _skin; } 
      set 
      { 
       _skin = value; 
       this.SkinID = _skin.ToString(); 
       this.CommandName = _skin.ToString(); 

       LoadDefaultValues(); 
      } 
     } 

我也嘗試循環throught page.contols,但在page_onpreinit事件是控件集合空。

是否有可能在其他地方比在aspx頁面更改SkinId?

感謝

回答

3

SkinID只能以編程方式上更改或之前OnPreInit - 啓動此爲控制你唯一的選擇是在頁面的OnPreInit

在正常情況下,。控制應該在該階段可用。

在某些情況下,你需要以下變通爲的.master網頁:

  /* 
      * 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 
    } 
} 
+0

提示+1。儘管如果你實際包含了自定義接口的實現,它會好一點。我花了一些時間才弄明白,但最終它成功了。 – NightOwl888 2011-10-20 19:58:10

相關問題