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 是最终对数据的呈现,而我们这里要做的是数据的绑定,所以如果我们把绑定的过程写到这里,那么最终呈现数据时就会发现绑定的数据始终为空值了。

原文地址:https://www.cnblogs.com/taoqianbao/p/2866036.html