Fork me on GitHub
听雨轩
生命易破碎,梦想只争朝夕!

1、自定义控件的使用

  a)首先我新建立了一个空的解决方案,在解决方案中新建了网站,用于测试自定义的控件;

  b)在解决方案中=>添加新项目=>在已安装的模板中选择“Asp.NET服务器控件”,确定后,

       默认就会生成一个ServerControl的控件项目,在这个控件项目中就可以添加自定义的控件了。

  c)创建一个显示当前日期的自定义控件

      代码如下:

     
view plaincopy to clipboardprint?
namespace ServerControlTest  
{  
    [DefaultProperty("Custom")]  
    [ToolboxData("<{0}:ShowDate runat=server></{0}:ShowDate>")]  
    public class ShowDate : WebControl  
    {  
        [Bindable(true)]  
        [Category("Appearance")]  
        [DefaultValue("Ch")]  
        [Localizable(true)]  
        public string Custom  
        {  
            get 
            {  
                String s = (String)ViewState["Custom"];  
                return ((s == null) ? "Ch" : s);  
            }  
            set 
            {  
                ViewState["Custom"] = value;  
            }  
        }  
        protected override void RenderContents(HtmlTextWriter output)  
        {  
            string s;  
            if (Custom.Equals("Ch"))  
            {  
                s = DateTime.Now.ToString("D");  
                string[] x = new string[7] { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };  
                int n;  
                n = int.Parse(DateTime.Now.DayOfWeek.ToString("D"));  
                s += " " + x[n] + " " + string.Format("{0:t}", DateTime.Now);  
            }  
            else 
            {  
                s = string.Format("{0:R}", DateTime.Now);  
            }  
            output.Write(s);  
        }  
    }  
namespace ServerControlTest
{
    [DefaultProperty("Custom")]
    [ToolboxData("<{0}:ShowDate runat=server></{0}:ShowDate>")]
    public class ShowDate : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("Ch")]
        [Localizable(true)]
        public string Custom
        {
            get
            {
                String s = (String)ViewState["Custom"];
                return ((s == null) ? "Ch" : s);
            }
            set
            {
                ViewState["Custom"] = value;
            }
        }
        protected override void RenderContents(HtmlTextWriter output)
        {
            string s;
            if (Custom.Equals("Ch"))
            {
                s = DateTime.Now.ToString("D");
                string[] x = new string[7] { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
                int n;
                n = int.Parse(DateTime.Now.DayOfWeek.ToString("D"));
                s += " " + x[n] + " " + string.Format("{0:t}", DateTime.Now);
            }
            else
            {
                s = string.Format("{0:R}", DateTime.Now);
            }
            output.Write(s);
        }
    } 

   这样自定义的控件创建完毕。

   d)将自定义的控件添加到工具箱中

      点击工具箱中的“选择项”=>在弹出的对话框中选择“浏览”=>选择刚才编译好的dll文件,

     这时会在.Net Framework组件中添加上已选的dll,点确定后就会将自定义的控件添加到工具箱中。

   e)在web页面中直接使用自定义的控件

     
view plaincopy to clipboardprint?
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>  
<%@ Register Assembly="ServerControlTest" Namespace="ServerControlTest" TagPrefix="cc2" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title>无标题页</title>  
</head>  
<body>  
    <form id="form1" runat="server">  
    <div>  
        <cc2:ShowDate ID="ShowDate1" runat="server" />  
       
    </div>  
    </form>  
</body>  
</html> 
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="ServerControlTest" Namespace="ServerControlTest" TagPrefix="cc2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <cc2:ShowDate ID="ShowDate1" runat="server" />
    
    </div>
    </form>
</body>
</html>

     和使用Label控件一样,直接从工具栏中将自定义的控件拖动到web页面中即可。

     在web中显示的结果如下:

       

      f)注意:在Web项目中使用自定义控件时,最好是添加对自定义控件的引用,如果添加了引用,

         当自定义控件修改编译后,Web项目中的控件也会自动的修改。

2、用户控件的使用

     a)用户控件声明性语法与用于创建 ASP.NET 网页的语法非常相似。主要的差别在于:用户控件使用 @ Control 指令取代了 @ Page 指令,并且用户控件在内容周围不包括 html 、body 和 form 元素。

     b)在Web项目中=>添加新项=>选择Web用户控件,确定后新的用户控件生成。

     c)生成的.ascx控件和.aspx页面一样

      添加的代码如下:

    
view plaincopy to clipboardprint?
后台代码WebUserControl.ascx.cs如下:  
public partial class WebUserControl : System.Web.UI.UserControl  
{  
    private int m_minValue;  
    private int m_maxValue = 100;  
    private int m_currentNumber = 0;  
    protected void Page_Load(object sender, EventArgs e)  
    {  
        if (IsPostBack)  
        {  
            m_currentNumber =  
                Int16.Parse(ViewState["currentNumber"].ToString());  
        }  
        else 
        {  
            m_currentNumber = this.MinValue;  
        }  
        DisplayNumber();  
    }  
    public int MinValue  
    {  
        get 
        {  
            return m_minValue;  
        }  
        set 
        {  
            if (value >= this.MaxValue)  
            {  
                throw new Exception("MinValue must be less than MaxValue.");  
            }  
            else 
            {  
                m_minValue = value;  
            }  
        }  
    }  
    public int MaxValue  
    {  
        get 
        {  
            return m_maxValue;  
        }  
        set 
        {  
            if (value <= this.MinValue)  
            {  
                throw new 
                    Exception("MaxValue must be greater than MinValue.");  
            }  
            else 
            {  
                m_maxValue = value;  
            }  
        }  
    }  
    public int CurrentNumber  
    {  
        get 
        {  
            return m_currentNumber;  
        }  
    }  
    protected void DisplayNumber()  
    {  
        textNumber.Text = this.CurrentNumber.ToString();  
        ViewState["currentNumber"] = this.CurrentNumber.ToString();  
    }  
    protected void buttonUp_Click(Object sender, EventArgs e)  
    {  
        if (m_currentNumber == this.MaxValue)  
        {  
            m_currentNumber = this.MinValue;  
        }  
        else 
        {  
            m_currentNumber += 1;  
        }  
        DisplayNumber();  
    }  
    protected void buttonDown_Click(Object sender, EventArgs e)  
    {  
        if (m_currentNumber == this.MinValue)  
        {  
            m_currentNumber = this.MaxValue;  
        }  
        else 
        {  
            m_currentNumber -= 1;  
        }  
        DisplayNumber();  
    }  

后台代码WebUserControl.ascx.cs如下:
public partial class WebUserControl : System.Web.UI.UserControl
{
    private int m_minValue;
    private int m_maxValue = 100;
    private int m_currentNumber = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            m_currentNumber =
                Int16.Parse(ViewState["currentNumber"].ToString());
        }
        else
        {
            m_currentNumber = this.MinValue;
        }
        DisplayNumber();
    }
    public int MinValue
    {
        get
        {
            return m_minValue;
        }
        set
        {
            if (value >= this.MaxValue)
            {
                throw new Exception("MinValue must be less than MaxValue.");
            }
            else
            {
                m_minValue = value;
            }
        }
    }
    public int MaxValue
    {
        get
        {
            return m_maxValue;
        }
        set
        {
            if (value <= this.MinValue)
            {
                throw new
                    Exception("MaxValue must be greater than MinValue.");
            }
            else
            {
                m_maxValue = value;
            }
        }
    }
    public int CurrentNumber
    {
        get
        {
            return m_currentNumber;
        }
    }
    protected void DisplayNumber()
    {
        textNumber.Text = this.CurrentNumber.ToString();
        ViewState["currentNumber"] = this.CurrentNumber.ToString();
    }
    protected void buttonUp_Click(Object sender, EventArgs e)
    {
        if (m_currentNumber == this.MaxValue)
        {
            m_currentNumber = this.MinValue;
        }
        else
        {
            m_currentNumber += 1;
        }
        DisplayNumber();
    }
    protected void buttonDown_Click(Object sender, EventArgs e)
    {
        if (m_currentNumber == this.MinValue)
        {
            m_currentNumber = this.MaxValue;
        }
        else
        {
            m_currentNumber -= 1;
        }
        DisplayNumber();
    }
}

     前台代码如下:

    
view plaincopy to clipboardprint?
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>  
<asp:TextBox ID="textNumber" runat="server" ReadOnly="true" Enabled="false"></asp:TextBox>  
<asp:Button ID="buttonUp" runat="server" Text="up" onclick="buttonUp_Click" />  
<asp:Button ID="buttonDown" runat="server" Text="down"   
    onclick="buttonDown_Click" /> 
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<asp:TextBox ID="textNumber" runat="server" ReadOnly="true" Enabled="false"></asp:TextBox>
<asp:Button ID="buttonUp" runat="server" Text="up" onclick="buttonUp_Click" />
<asp:Button ID="buttonDown" runat="server" Text="down"
    onclick="buttonDown_Click" />

  这样一个用户控件创建完毕。

   d)使用用户控件

     
view plaincopy to clipboardprint?
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>  
<%@ Register Assembly="ServerControlTest" Namespace="ServerControlTest" TagPrefix="cc2" %>  
<%@ Register Src="~/WebUserControl.ascx" TagName="WebUserControl" TagPrefix="wuc" %>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title>无标题页</title>  
</head>  
<body>  
    <form id="form1" runat="server">  
    <div>  
        <cc2:ShowDate ID="ShowDate1" runat="server" />  
        <wuc:WebUserControl ID="webId" runat="server" />  
    </div>  
    </form>  
</body>  
</html> 
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="ServerControlTest" Namespace="ServerControlTest" TagPrefix="cc2" %>
<%@ Register Src="~/WebUserControl.ascx" TagName="WebUserControl" TagPrefix="wuc" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <cc2:ShowDate ID="ShowDate1" runat="server" />
        <wuc:WebUserControl ID="webId" runat="server" />
    </div>
    </form>
</body>
</html>

     显示的页面如下:

            

3、自定义控件和用户控件的区别

  a)用户控件易于创建,为使用可视化设计工具的使用者提供有限的支持,每个应用程序中需要控件的一个单独副本,不能添加到visual  studio 工具箱中,适用于静态布局,它们在高级方案中使用起来可能不太方便。
自定义服务器控件是经过编译的代码,这使其易于使用但难于创建。它为使用者提供完全的可视化设计工具支持,仅在全局程序集缓存中需要控件的单个副本,可以添加到visual studio 中的工具箱,适用于动态布局。
如果您的控件包含大量静态布局,用户控件则可能是较佳的选择。如果您的控件主要是动态生成的,自定义控件则是较佳的选择。

 


b) 用户控件(UserControl):  扩展名为*.ascx,跟*.aspx在结构上相似,是指页面中 加载的功能块,只是用户控件不能单独作为页面运行,必须嵌入到*.aspx页面或其它用户控件中使用. 
    自定义控件,跟HtmlControl或WebControl相似,编译后可以添加引用到工具栏里面,直接用鼠标拖动使用.

 4、 控件的呈现方法(Rendering)的内核

       参照:http://blog.csdn.net/21aspnet/archive/2005/03/12/318347.aspx


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wl_ldy/archive/2010/07/21/5751830.aspx

posted on 2010-10-17 19:23  流水殇  阅读(984)  评论(2编辑  收藏  举报