天天看點

模拟Asp.Net Forums實作可以換皮膚的控件 (轉載)

<b>第一步:建立ThemeDemo項目</b>

<b>第二步:添加基類SkinnedWebControl.cs</b>

using System;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.IO;

namespace WebUC.ThemeDemo.Controls 

{

    [

    ParseChildren(true) 

    ]

    /// &lt;summary&gt;

    /// 換皮膚控件基類

    /// &lt;/summary&gt;

    public abstract class SkinnedWebControl : WebControl, INamingContainer 

    {

    string skinFilename = null;

    protected override void CreateChildControls() 

        Control skin;

        // 裝載使用者控件檔案

        skin = LoadSkin();

        // 初始化控件和對控件綁定

        InitializeSkin(skin);

        Controls.Add(skin);

    }

    /// 裝載使用者控件檔案

    /// &lt;returns&gt;&lt;/returns&gt;

    protected Control LoadSkin() 

        // 使用者控件檔案預設放在Themes目錄下

        string skinPath = "Themes/" + SkinFilename;

        // 是否定義了使用者控件檔案?

        if (SkinFilename == null)

        throw new Exception("必須定義SkinFilename屬性,指定使用者控件檔案路徑");

        // 通過Page.LoadControl(defaultSkinPath)方法,從使用者控件檔案中擷取 UserControl 對象

        try 

        {

        skin = Page.LoadControl(skinPath);

        }

        catch (FileNotFoundException) 

        throw new Exception("使用者控件檔案未找到!");

        return skin;

    /// 初始化控件,并綁定控件資料

    /// &lt;param name="skin"&gt;&lt;/param&gt;

    protected abstract void InitializeSkin(Control skin);

    /// 使用者控件檔案路徑

    public string SkinFilename 

        get { return skinFilename;}

        set { skinFilename = value; }

}

<b>第三步:建立Themes目錄,并建立兩個使用者控件檔案Login.ascx和Login1.ascx</b>。布局樣式不同,但是都必須包含以下控件:

TextBox    Username

TextBox    Password

Button     LoginButton

Label      Result

Login.ascx

  &lt;P&gt;登陸頁的預設皮膚樣式&lt;/P&gt;

&lt;P&gt;使用者名:&lt;asp:TextBox id="Username" runat="server"&gt;&lt;/asp:TextBox&gt;&lt;/P&gt;

&lt;P&gt;密  碼:&lt;asp:TextBox id="Password" runat="server" TextMode="Password"/&gt;&lt;/P&gt;

&lt;P&gt;&lt;asp:Button id="LoginButton" runat="server" Text="登陸"/&gt;&lt;/P&gt;

&lt;P&gt;&lt;asp:Label id="Result" runat="server"/&gt;&lt;/P&gt;

Login1.ascx

  &lt;P&gt;登陸頁的皮膚樣式1&lt;/P&gt;

使用者名:&lt;asp:TextBox id="Username" runat="server"/&gt;

密  碼:&lt;asp:TextBox id="Password" runat="server" TextMode="Password"/&gt; 

&lt;asp:Button id="LoginButton" runat="server" Text="登陸"/&gt;&lt;asp:Label id="Result" runat="server"/&gt;

<b>第四步:建立Login控件Login.cs</b>

    /// 登陸控件,繼承自SkinnedWebControl

    public class Login : SkinnedWebControl

        string skinFilename = "Login.ascx"; // 指定預設皮膚樣式

        TextBox username; // 帳号輸入框

        TextBox password; // 密碼輸入框

        Button loginButton; // 登陸按鈕

        Label result; // 顯示登陸結果 

        public Login()

        {

            if (SkinFilename == null)

                SkinFilename = skinFilename;

        }

        /// &lt;summary&gt;

        /// 重寫InitializeSkin,初始化控件和對控件進行綁定

        /// &lt;/summary&gt;

        /// &lt;param name="skin"&gt;&lt;/param&gt;

        protected override void InitializeSkin(System.Web.UI.Control skin)

            // 查找ascx頁中ID是username的textbox控件

            username = (TextBox) skin.FindControl("Username");

            // 綁定資料

            username.Text = "demo";

            // 查找ascx頁中ID是password的textbox控件

            password = (TextBox) skin.FindControl("Password");

            password.Attributes.Add("value","demo");

            // 初始化Result控件

            result = (Label) skin.FindControl("Result");

            // 找到登陸按鈕

            loginButton = (Button) skin.FindControl("LoginButton");

            loginButton.Click += new System.EventHandler(LoginButton_Click); // 綁定登陸按鈕的Click事件

        /// 響應登陸按鈕事件

        /// &lt;param name="sender"&gt;&lt;/param&gt;

        /// &lt;param name="e"&gt;&lt;/param&gt;

        public void LoginButton_Click(Object sender, EventArgs e) 

            if (username.Text == "demo" &amp;&amp; password.Text == "demo")

                result.Text = "&lt;font color='blue'&gt;登陸成功!";

            else

                result.Text = "&lt;font color='red'&gt;登陸失敗,使用者名密碼不比對!";

 

<b>第五步:建立兩個aspx頁,分别把兩種風格的登陸控件加入。</b>

Login.aspx

Login1.aspx

<b>最後,分别運作看看效果:)</b>

模拟Asp.Net Forums實作可以換皮膚的控件 (轉載)
模拟Asp.Net Forums實作可以換皮膚的控件 (轉載)
模拟Asp.Net Forums實作可以換皮膚的控件 (轉載)

<a href="http://webuc.net/download/ThemeDemo.rar">源碼下載下傳</a>

本文轉自高海東部落格園部落格,原文連結:http://www.cnblogs.com/ghd258/archive/2005/12/18/299444.html,如需轉載請自行聯系原作者

繼續閱讀