11.5 自定义控件实例

  虽然用户控件能够尽快的上手并运用在开发中,但是自定义控件的编写能够实现更多的效果。如分页效果在大部分的数据索引中,都需要使用分页。如果存在这么一个分页控件,只需要指定需要分页的表,那么可以自动分页,就能够更加方便应用程序开发了。

11.5.1 ASP.NET分页控件
  ASP.NET能够编写自定义控件,并将自定义控件编译为DLL文件以保证在任何其他的项目中能够使用自定义控件。在ASP.NET Web应用程序开发中,对于数据的索引,通常情况下是不可能全部将数据索引到一个页面的,所以在显示数据时,就需要进行分页操作。
  当用户打开一个页面时,如果将全部的数据一起显示在页面,不仅页面臃肿难看,并且用户很难找到自己需要的信息。对于页面数据的整理和索引,能够让用户更加方便的找到自己需要的信息。不仅如此,如果一次全部的将数据呈现到HTML页面,势必会造成HTML页面数据的冗长,在运行页面时,也会增加服务器的压力,让Web应用程序变得非常的缓慢。
1.属性设置
  使用ASP.NET分页控件,能够让数据分开显示,让用户能够自行选择,并且能够自行选择页码,查看相应的数据,创建一个MyPager自定义控件,用来执行分页操作,如图11-22所示。
创建MyPager控件
图11-22 创建MyPager控件
  创建完成后,就需要确定一些基本的属性,这些属性能够方便控件的使用者进行相应的配置,能够尽快的使用控件并完成编程目的。对于分页控件,通常需要确定的属性如下所示:
1)PageSize:用户希望一个页面呈现多少数据。
2)Server:数据库服务器的地址。
3)Database:数据库服务器的数据库。
4)Pwd:数据库服务器有效的密码。
5)Uid:数据库服务器有效的用户名。
6)Table:需要执行分页的表,如果不指定SqlCommand,则自动生成语句。
7)SqlCommand:如果不指定表,则执行SqlCommand。
8)IndexPage :一开始的索引页面。
9)PageName:当前页面的名称,用于跳转。
2.数据属性配置
  在基本确定了以上属性后,就可以编写相应代码,首先需要为数据库连接和数据库的SQL语句的功能实现编写相应的属性,示例代码如下所示。
+展开
-C#
    [DefaultProperty("Text")]//默认属性
    [ToolboxData("<{0}:MyPager runat=server></{0}:MyPager>")]//控件呈现代码
    public class MyPager : WebControl
    {
        [Bindable(true)]//设置是否支持绑定
        [Category("Appearance")]//设置类别
        [DefaultValue("")]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string Text//Text文本属性
        {
            get//获取属性
            {
                String s = (String)ViewState["Text"];//获取文本属性
                return ((s == null) ? "[" + this.ID + "]" : s);//设置文本属性默认值
            }
            set //设置属性
            {
                ViewState["Text"] = value;
            }
        }
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(10)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public int PageSize//分页数属性
        {
            get
            {
                try
                {
                    Int32 s = (Int32)ViewState["PageSize"];//获取分页值
                    return ((s.ToString() == null) ? 10 : s);//设置默认值
                }
                catch//如果用户输入异常
                {
                    return 10;//返回分页数
                }
            }
            set
            {
                ViewState["PageSize"] = value;//设置分页
            }
        }

  上述属性设置了分页属性,当开发人员使用该控件进行分页设置时,该控件会根据不同的分页属性进行分页设置并进行分页操作。在执行分页前,还需要进行数据库的连接,这就需要编写数据连接属性,示例代码如下所示。
+展开
-C#
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(“”)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string Server//服务器地址
        {
            get
            {
                String s = (String)ViewState["Server"]; //设置服务器地址
                return ((s == null) ? ("(local)") : s);//默认服务器地址
            }
            set
            {
                ViewState["Server"] = value;//设置默认值
            }
        }
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(“”)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string DataBase//数据库属性
        {
            get
            {
                String s = (String)ViewState["DataBase"];//设置数据库属性
                return ((s == null) ? ("none") : s);//设置默认值
            }
            set
            {
                ViewState["DataBase"] = value;//设置默认值
            }
        }
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(“”)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string Uid//数据库用户名
        {
            get
            {
                String s = (String)ViewState["Uid"];//设置UID属性
                return ((s == null) ? ("uid") : s);//设置默认值
            }
            set
            {
                ViewState["Uid"] = value;//设置默认值
            }
        }
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(“”)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string Pwd//数据库密码
        {
            get
            {
                String s = (String)ViewState["Pwd"];//设置密码属性
                return ((s == null) ? ("none") : s);//设置默认值
            }
            set
            {
                ViewState["Pwd"] = value;//设置默认值
            }
        }
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(“”)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string Table//分页的表
        {
            get
            {
                String s = (String)ViewState["Table"];//设置分页的表
                return ((s == null) ? ("none") : s); //设置默认值
            }
            set
            {
                ViewState["Table"] = value;//设置默认值
            }
        }
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(“”)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string SqlCommand //Sql语句
        {
            get
            {
                String s = (String)ViewState["SqlCommand"];//设置SQL语句
                return ((s == null) ? ("none") : s); //设置默认值
            }
            set
            {
                ViewState["SqlCommand"] = value;//设置默认值
            }
        }

  上述代码为数据库连接进行了属性配置,这些属性分别包括数据库连接字串、数据库服务器IP、数据库用户名、数据库密码等,这些属性用于配置不同的数据库以呈现不同的数据。
3.页面属性配置
  在编写了数据属性后,还需要编写相应的页面属性以便能够对页面进行控制,这些属性包括页面名称、索引等,示例代码如下所示。
+展开
-C#
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(“”)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string IndexPage//索引页面
        {
            get
            {
                String s = (String)ViewState["IndexPage"];//获取当前页面配置属性
                return ((s == null) ? ("none") : s);//返回默认值
            }
            set
            {
                ViewState["IndexPage"] = value; //设置默认配置属性
            }
        }
        [Bindable(true)]//设置是否支持绑定
        [Category("Data")]//设置类别Data
        [DefaultValue(“”)]//设置默认值
        [Localizable(true)]//设置是否支持本地化操作
        public string PageName //页面名称
        {
            get
            {
                String s = (String)ViewState["PageName"];//获取页面名称
                return ((s == null) ? ("none") : s);//设置默认值
            }
            set
            {
                ViewState["PageName"] = value;//返回默认值
            }
        }

  在编写完成相应的属性后,就需要重写Render方法来执行HTML流输出,示例代码如下所示。
+展开
-C#
        protected override void RenderContents(HtmlTextWriter output)
        {
            string html = "";
            string str = "server='" + Server + "';database='" + DataBase + "';uid='" + Uid + "';pwd='" + Pwd + "'";
            string strsql = "";
            SqlConnection con = new SqlConnection(str); //创建连接对象
            try
            {
                con.Open();//打开数据连接
                if (SqlCommand == "none" || SqlCommand == "")//如果不自定义Table则自动生成
                {
                    strsql = "select count(*) as mycount from " + Table + "";//生成SQL语句
                }
                else
                {
                    strsql = SqlCommand;//设置默认SQL语句
                }
                SqlDataAdapter da = new SqlDataAdapter(strsql, con);//创建适配器
                DataSet ds = new DataSet();//创建数据集
                int count = da.Fill(ds, "count"); //填充数据集
                int page = 0;//数据表中的行数
                int pageCount = 0;//分页数
                if (count > 0)//获取数据表中的行数
                {
                    page = Convert.ToInt32(ds.Tables["count"].Rows[0]["mycount"].ToString());
                }
                if (page % PageSize > 0)//开始分页
                {
                    pageCount = (page / PageSize) + 1;//分页计算
                }
                else
                {
                    pageCount = page / PageSize;
                }
                html += "<table><tr>";
                for (int i = 0; i < pageCount; i++)
                {
                    if (IndexPage != i.ToString())//如果查看的是当前页面,则高亮显示
                    {
                        html += "<td style=\"padding:5px 5px 5px 5px;background:#f0f0f0;border:1px dashed #ccc;\">";//呈现相应的HTML
                    }
                    else
                    {
                        html += "<td style=\"padding:5px 5px 5px 5px;background:Gray;border:1px dashed #ccc;\">";//呈现相应的HTML
                    }
                    html += "<a href=\"" + PageName + "?page=" + i + "\">" + i + "</a>";
                    html += "</td>";//完成HTML
                }
                html += "</tr></table>";//完成HTML
            }
            catch(Exception ee) //出现错误抛出异常
            {
                html = ee.ToString();//输出异常
            }
            finally
            {
                output.Write(html);//页面呈现
                con.Close();
            }
        }

  上述代码会查询相应的数据库,例如Table。当查询到了相应的数据库中数据的行数之后,再与PageSize属性进行对比,并执行分页查询,查询完成后将通过查询的条目数循环遍历输出HTML,并将HTML呈现在页面中。

11.5.2 ASP.NET分页控件的使用
自定义控件能够使用在各种其他的应用程序开发中。而任何其他的应用程序如果需要使用分页控件,则需要首先添加引用。右击当前项目,选择【添加引用】选项,单击【浏览】选项卡,浏览到项目的bin目录下,选择相应的DLL文件即可,如图11-23所示。
添加引用
图11-23 添加引用
  添加引用后,同样需要在需要使用的页面进行注册,示例代码如下所示。
+展开
-HTML
<%@ Register TagPrefix="MyControl" Namespace="MyPager" Assembly="MyPager" %>

  添加注册后,在工具栏中就会显示自定义控件,拖动自定义控件到页面中就可以使用自定义控件并配置相应的属性,系统自动生成的HTML代码如下所示。
+展开
-HTML
<%@ Register TagPrefix="MyControl" Namespace="MyPager" Assembly="MyPager" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>   
        <MyControl:MyPager ID="MyPager1" runat="server" DataBase="mytable" 
            IndexPage="1" PageName="default.aspx" PageSize="1" Pwd="Bbg0123456#" 
            Table="mynews" Uid="sa" />

    </div>
    </form>
</body>
</html>

为了能够使分页控件能够自动进行分页,则需要对属性进行相应的配置,如图11-24所示。配置完毕后,控件就能够实现自动分页,如图11-25所示。
配置属性
图11-24 配置属性
分页控件
图11-25 分页控件
通过修改相应的属性,能够为不同的表,甚至不同的数据库进行分页操作,运行结果如图11-26所示。
运行分页控件
图11-26 运行分页控件
  当配置PageSize属性为1时,系统则会按每页1个数据来进行分页,同样当配置PageSize属性为10时,则系统会按照每页10个数据来进行分页。
注意:在编写分页控件时,这里需要配置服务器信息,这样做是非常不安全的,这里的属性配置可以放在Web.config文件中,这样配置就更加的安全,具体可参考SqlDataSource的做法。

加支付宝好友偷能量挖...


评论(0)网络
阅读(133)喜欢(0)Asp.Net/C#/WCF