模拟Asp.Net Forums实现可以换皮肤的控件 (转载)

简介:

为了帮助您理解《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换皮肤的,现在我们一起来写一个代码分离带换皮肤功能的登陆页面:

第一步:新建ThemeDemo项目

第二步:添加基类SkinnedWebControl.cs

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;


namespace WebUC.ThemeDemo.Controls 
{

    [
    ParseChildren( true
    ]
    /// <summary>
    /// 换皮肤控件基类
    /// </summary>

     public abstract class SkinnedWebControl : WebControl, INamingContainer 
    {

     string skinFilename =  null;


     protected override void CreateChildControls() 
    {
        Control skin;

         // 装载用户控件文件
        skin = LoadSkin();

         // 初始化控件和对控件绑定
        InitializeSkin(skin);

        Controls.Add(skin);
    }


    /// <summary>
    /// 装载用户控件文件
    /// </summary>
    /// <returns></returns>

     protected Control LoadSkin() 
    {
        Control skin;

         // 用户控件文件默认放在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;
    }


    /// <summary>
    /// 初始化控件,并绑定控件数据
    /// </summary>
    /// <param name="skin"></param>

     protected abstract void InitializeSkin(Control skin);



    /// <summary>
    /// 用户控件文件路径
    /// </summary>

     public string SkinFilename 
    {
         get {  return skinFilename;}
         set { skinFilename =  value; }
    }

    }
}

第三步:创建Themes目录,并创建两个用户控件文件Login.ascx和Login1.ascx。布局样式不同,但是都必须包含以下控件:
TextBox    Username
TextBox    Password
Button     LoginButton
Label      Result
Login.ascx

  <P>登陆页的默认皮肤样式</P>
<P>用户名:<asp:TextBox id="Username" runat="server"></asp:TextBox></P>
<P>密  码:<asp:TextBox id="Password" runat="server" TextMode="Password"/></P>
<P><asp:Button id="LoginButton" runat="server" Text="登陆"/></P>
<P><asp:Label id="Result" runat="server"/></P>
Login1.ascx
  <P>登陆页的皮肤样式1</P>
用户名:<asp:TextBox id="Username" runat="server"/>
密  码:<asp:TextBox id="Password" runat="server" TextMode="Password"/> 
<asp:Button id="LoginButton" runat="server" Text="登陆"/><asp:Label id="Result" runat="server"/>

第四步:创建Login控件Login.cs

using System;
using System.Web;
using System.Web.UI.WebControls;

namespace WebUC.ThemeDemo.Controls 
{
    /// <summary>
    /// 登陆控件,继承自SkinnedWebControl
    /// </summary>

     public class Login : SkinnedWebControl
    {
         string skinFilename = "Login.ascx";  // 指定默认皮肤样式
        TextBox username;  // 帐号输入框
        TextBox password;  // 密码输入框
        Button loginButton;  // 登陆按钮
        Label result;  // 显示登陆结果 

         public Login()
        {
             if (SkinFilename ==  null)
                SkinFilename = skinFilename;
        }

        /// <summary>
        /// 重写InitializeSkin,初始化控件和对控件进行绑定
        /// </summary>
        /// <param name="skin"></param>

         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事件
        }

        /// <summary>
        /// 响应登陆按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

         public void LoginButton_Click(Object sender, EventArgs e) 
        {
             if (username.Text == "demo" && password.Text == "demo")
                result.Text = "<font color='blue'>登陆成功!";
             else
                result.Text = "<font color='red'>登陆失败,用户名密码不匹配!";
        }

    }
}
 

第五步:新建两个aspx页,分别把两种风格的登陆控件加入。
Login.aspx

<%@ Register TagPrefix="uc" Namespace="WebUC.ThemeDemo.Controls" Assembly="ThemeDemo" %>
<HTML>
 <HEAD>
  <title>换皮肤控件测试——默认皮肤</title>
 </HEAD>
 <body>
  <form runat="server">
    <uc:Login runat="server"/>
  </form>
 </body>
</HTML>
Login1.aspx
<%@ Register TagPrefix="uc" Namespace="WebUC.ThemeDemo.Controls" Assembly="ThemeDemo" %>
<HTML>
 <HEAD>
  <title>换皮肤控件测试——另一皮肤</title>
 </HEAD>
 <body>
  <form runat="server">
    <uc:Login runat="server" SkinFilename="Login1.ascx"/>
  </form>
 </body>
</HTML>

最后,分别运行看看效果:)

源码下载

原文地址 http://webuc.net/dotey/archive/2004/05/28/835.aspx




本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2005/12/18/299444.html,如需转载请自行联系原作者

相关文章
|
7月前
|
开发框架 JavaScript 前端开发
震撼!破解 ASP.NET 服务器控件 Button 执行顺序之谜,颠覆你的开发认知!
【8月更文挑战第16天】在ASP.NET开发中,通过Button控件实现先执行JavaScript再触后台处理的需求十分常见。例如,在用户点击按钮前需前端验证或提示,确保操作无误后再传递数据至后台深度处理。此过程可通过设置Button的`OnClientClick`属性调用自定义JavaScript函数完成验证;若验证通过,则继续触发后台事件。此外,结合jQuery也能达到相同效果,利用`__doPostBack`手动触发服务器端事件。这种方式增强了应用的交互性和用户体验。
70 8
|
5月前
|
开发者 Windows
.NET 开源扁平化、美观的 C/S 控件库
【10月更文挑战第23天】介绍了三款适用于 .NET 平台的开源扁平化、美观的 C/S 控件库:MaterialSkin 采用 Google Material Design 风格,适合现代感界面;Krypton Toolkit 提供丰富控件,界面易于定制;Fluent Ribbon Control Suite 模仿 Office 界面,适合复杂功能应用。每款控件库均附有示例代码及 GitHub 链接。
202 0
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
5月前
|
C# Android开发 iOS开发
一组.NET MAUI绘制的开源控件 - AlohaKit
一组.NET MAUI绘制的开源控件 - AlohaKit
120 0
|
6月前
|
开发框架 JavaScript 前端开发
|
10月前
|
SQL 开发框架 JavaScript
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
分享33个ASP.NET电子商务源码和40个ASP.NET控件组件源码,总有一款适合您
150 0
|
10月前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
106 0
|
10月前
|
JavaScript C#
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】2.wincc使用C#开发的.net控件
188 0
|
10月前
|
JavaScript Linux C#
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
【傻瓜级JS-DLL-WINCC-PLC交互】1.C#用windows窗体控件创建.net控件
188 0
|
10月前
|
开发框架 .NET 数据安全/隐私保护
Asp.Net第二章服务器端控件
Asp.Net第二章服务器端控件
70 0

热门文章

最新文章

相关实验场景

更多