zoukankan      html  css  js  c++  java
  • 自定义控件的使用以及与用户控件的区别

    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

    仅此而已
  • 相关阅读:
    Eclipse代码快捷键
    QuickBI助你成为分析师——计算字段功能
    怎么从Linux服务器上下载超过4G的文件?
    centOS7下Spark安装配置
    s3c2440裸机-清bss原理及实现
    s3c2440裸机-代码重定位(2.编程实现代码重定位)
    Markdown语法教程
    s3c2440裸机-代码重定位(1.重定位的引入,为什么要代码重定位)
    s3c2440裸机-内存控制器(五、SDRAM编程实现)
    s3c2440裸机-内存控制器(四、SDRAM原理-cpu是如何访问sdram的)
  • 原文地址:https://www.cnblogs.com/yuananyun/p/1853755.html
Copyright © 2011-2022 走看看