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

  • 相关阅读:
    WPF中DataGrid的应用-绑定,增改删,分页,样式
    每隔一秒获取时间
    常识
    VS2013程序打包部署详细图解
    Vs2010 WPF 项目打包
    WPF InkCanvas 画图 基础使用教程
    WPF Template模版之寻找失落的控件【三】
    WPF Template模版之DataTemplate与ControlTemplate【一】
    WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】
    淡入效果
  • 原文地址:https://www.cnblogs.com/taoqianbao/p/2866036.html
Copyright © 2011-2022 走看看