zoukankan      html  css  js  c++  java
  • ASP.NET 自定义控件学习研究

    ASP.NET 自定义控件学习研究

    1. 学习当然要从最基本的练习HELLOWORLD开始啦。

    下面我们就从最简单的示例说起:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Phillip.FAME.ServerControl
    {
        [DefaultProperty("Text")]
        [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
        public class ServerControl1 : WebControl
        {
            [Bindable(true)]
            [Category("Appearance")]
            [DefaultValue("")]
            [Localizable(true)]
            public string Text
            {
                get
                {
                    String s = (String)ViewState["Text"];
                    return ((s == null) ? "[" + this.ID + "]" : s);
                }
    
                set
                {
                    ViewState["Text"] = value;
                }
            }
    
            protected override void RenderContents(HtmlTextWriter output)
            {
                output.Write(Text);
            }
        }
    }

    以上代码就是从VS中创建一个自定义服务器控件后,默认的状态。

    从上面的示例可以看出,所有的ASP.NET控件继承与WEBCONTROL类,而示例也简单的显示了一个文本,该控件就像是一个 System.Web.UI.WebControls.Literal 控件一样。

    其中我们注意到如何将文本显示到页面的呢?

    关键在于我们重写了 WEBCONTROL方法的 RenderContents方法。

    该方法将控件的内容呈现到指定的编写器中,HtmlTextWriter,表示要在客户端呈现 HTML 内容的输出流。
    由此可以看到这个方法是用来最终定义输入HTML的内容的,所以在开发自定义控件时,一定要注意RenderContents是不是实现了你最终想的HTML输出。

    根据这个提示,我们进入下一步:

    2. 如何绑定数据到自定义的控件里呢?

    比如我们经常会用到一些DROPDOwNLIST,经常需要绑定一些数据库的配置信息,这个时候,页面就需要每次重写哪些烦人的绑定操作。如果现在你学会了自定义控件,就不再那么麻烦了。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Phillip.FAME.ServerControl
    {
        [DefaultProperty("Text")]
        [ToolboxData("<{0}:TQBDropDownList runat=server></{0}:TQBDropDownList>")]
        public class TQBDropDownList : DropDownList
        {
            [Bindable(true)]
            [Category("Appearance")]
            [DefaultValue("")]
            [Localizable(true)]
            public Common.Enums.UserTypeEnum Types
            {
                get
                {
                    Common.Enums.UserTypeEnum s = (Common.Enums.UserTypeEnum)ViewState["Types"];
                    return s;
                }
                set
                {
                    ViewState["Types"] = value;
                }
            }
    
            protected override void OnPagePreLoad(object sender, EventArgs e)
            {
                if (Types == Common.Enums.UserTypeEnum.FirmAdmin)
                {
                    System.Data.DataTable dt = new System.Data.DataTable();
                    //you can get data from your database.
    
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        this.Items.Add(dt.Rows[i]["column"].ToString());
                    }
                }
    
                base.OnPagePreLoad(sender, e);
    
                this.DataBind();
            }
        }
    }

    上面的示例就是一个简单的从数据库读取数据,绑定到DROPDOWNLIST控件中的DEMO。从上面的示例可以很容易看到,最关键的步骤在于OnPagePreLoad方法,那么这里就要认真的考虑,为什么这里不是使用 RenderContents , 而是OnPagePreLoad方法了,原因就在于数据的绑定过程了。

    因为DropdownList是继承自ListControls的,所以Items的定义在ListControls中,发现Items在RenderContents方法中被调用了,并且将其生成了最终的HTML代码option.

    之前我们说过,RenderContents 是最终对数据的呈现,而我们这里要做的是数据的绑定,所以如果我们把绑定的过程写到这里,那么最终呈现数据时就会发现绑定的数据始终为空值了。

  • 相关阅读:
    管道命令'|' 和xargs find命令找到后把所有找到的删除
    UVa
    【手势交互】9. PS Move
    jquery时间格式化插件
    Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity
    hdu 2604 Queuing (矩阵高速幂)
    【Linux驱动】TQ2440 DM9000E网卡驱动移植(Linux-2.6.30.4)
    bzoj2648 SJY摆棋子
    Hive编程指南_学习笔记01
    通信协议中的转义符
  • 原文地址:https://www.cnblogs.com/taoqianbao/p/2866036.html
Copyright © 2011-2022 走看看