2009-06-07 2 views
0

codeBehind에서 skinId를 변경할 수있는 방법이 있습니까? 다른 속성을 설정하는 동안 시도했지만 작동하지 않습니다. 피부는 적용되지 않습니다.CodeBehind의 SkinID

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

       LoadDefaultValues(); 
      } 
     } 

또한 루프 통과 페이지 .contols를 시도했지만 page_onpreinit 이벤트는 컨트롤 컬렉션이 비어 있습니다.

SkinId를 aspx 페이지 이외의 다른 곳으로 변경할 수 있습니까?

감사

답변

3

는 프로그래밍에 변경 될 수 있습니다 SkinID 또는 전에을 OnPreInit - 컨트롤이를 시작하는 유일한 옵션에있는 페이지의 OnPreInit.

정상적인 상황에서는 .Controls을 해당 단계에서 사용할 수 있어야합니다. 이제 몇 가지 인터페이스 (IRuntimeSkinableControl)를 구현 스키닝 필요 컨트롤을 가질 수

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

      InvokeControlPreInit(Controls); 

그들 자신을 할당 할 수 있습니다 :

은 경우에 따라 다음 해결 방법 .master 페이지에 대한 필요 스킨 :

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

관련 문제