天天看點

自定義控件的使用以及與使用者控件的差別

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" οnclick="buttonUp_Click" />  

<asp:Button ID="buttonDown" runat="server" Text="down"   

    οnclick="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" οnclick="buttonUp_Click" />

<asp:Button ID="buttonDown" runat="server" Text="down"

    οnclick="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

轉載于:https://www.cnblogs.com/yuananyun/archive/2010/10/17/1853755.html