質問

codeBehindでskinIdを変更する方法はありますか?他のプロパティの設定中に試してみましたが、うまくいきません。スキンは適用されません。

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

                LoadDefaultValues();
            }
        }

また、page.contols をループしようとしましたが、page_onpreinit イベントではコントロール コレクションが空です。

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

ありがとう

役に立ちましたか?

解決

スキンID プログラムによって変更できるのは、それ以前のみです OnPreInit - コントロールに対してこれを開始する唯一のオプションは、ページの OnPreInit.

通常の状況下で、 .コントロール その段階で利用可能になるはずです。

場合によっては、次の回避策が必要になります。 。マスター ページ:

            /*
             * 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
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top