2009-06-07 9 views
0

codeBehindのskinIdを変更する方法はありますか? 他のプロパティの設定中に試しましたが、機能しません。スキンは適用されません。CodeBehindのSkinID

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

       LoadDefaultValues(); 
      } 
     } 

私もループスルーpage.contolsを試みましたが、page_onpreinitイベントではコントロールコレクションが空です。

SkinIdをaspxページ以外の場所で変更することはできますか?

おかげ

答えて

3

SkinIDは上または OnPreInit 前にプログラムで変更することができます - コントロールのためにこれを開始するためにあなたの唯一のオプションは、ページのOnPreInitです。

通常の状況では、。コントロールがその段階で使用可能になります。あなたは今、いくつかのインタフェース(IRuntimeSkinableControl)を実装スキニング必要なコントロールを持つことができます

  /* 
      * HACK: need to ensure master controls are instantiated first. 
      * */ 
      MasterPage root = this.Master; 
      while (root.Master != null) 
       root = root.Master; 

      InvokeControlPreInit(Controls); 

彼らは自分自身を割り当てることができます:

は、いくつかのケースでは、次の回避策管理組織のビー玉ページのを必要としますスキン:

public class UserControl : System.Web.UI.UserControl, IRuntimeSkinableControl 
{ 
    public virtual void OnPreInit() 
    { 
     //assign this.SkinID 
    } 
} 

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

制御はそうのようにそれを適用しますチップの場合、

+0

+1。実際にカスタムインターフェイスの実装が含まれている方が少し良いでしょう。それを理解するまでには時間がかかりましたが、最終的にはうまくいきました。 – NightOwl888

関連する問題