Asp.Net服务器控件开发的Grid实现(二)

我们先来实现Grid类,代码如下:

Grid.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI;

namespace AspNetServerControl
{
    [Designer("AspNetServerControl.Design.GridDesigner, AspNetServerControl.Design")]//设计时支持,需要另外写一个对就的类
    [ToolboxData("<{0}:Grid Title=\"Grid\" runat=\"server\"><Columns></Columns></{0}:Grid>")]
    [ToolboxBitmap(typeof(Grid), "toolbox.Grid.bmp")]
    [Description("表格控件")]
    [ParseChildren(true)]
    [PersistChildren(false)]
    [ControlBuilder(typeof(NotAllowWhitespaceLiteralsBuilder))]
    public class Grid : ControlBase
    {

        #region 属性

        #region DataSource
        private object _dataSource;
        public object DataSource
        {
            get { return _dataSource; }
            set { _dataSource = value; }
        }
        #endregion

        #region Columns
        private GridColumnCollection _columns;
        /// <summary>
        /// 列数据
        /// </summary>
        [Category(CategoryName.OPTIONS)]
        [NotifyParentProperty(true)]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        [Editor(typeof(GridColumnsEditor), typeof(System.Drawing.Design.UITypeEditor))]//用于编辑器
        public virtual GridColumnCollection Columns
        {
            get
            {
                if (_columns == null)
                {
                    _columns = new GridColumnCollection(this);

                }
                return _columns;
            }
        }
        #endregion

        #endregion

        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(writer);
            if (_columns == null)
            {
                return;
            }
            writer.Write("<table border=\"1\" cellspacing=\"0\">");
            RenderHeader(writer);
            RenderBody(writer);
            writer.Write("</table>");
        }

        private void RenderHeader(HtmlTextWriter writer)
        {
            writer.Write("<tr>");
            foreach (GridColumn column in Columns)
            {
                writer.Write(String.Format("<th  >{0}</th>", column.HeaderText));
            }
            writer.Write("</tr>");
        }

        private void RenderBody(HtmlTextWriter writer)
        {
            DataTable dt = DataSource as DataTable;
            if (dt == null || dt.Rows.Count <= 0)
            {
                return;
            }

            writer.Write("<tbody>");
            foreach (DataRow row in dt.Rows)
            {
                writer.Write("<tr >");
                foreach (GridColumn column in Columns)
                {
                    writer.Write(String.Format("<td  >{0}</td>", row[column.DataField]));
                }
                writer.Write("</tr>");
            }
            writer.Write("</tbody>");
        }
    }
}

1.Grid类前面的几个属性相当重要:

(1).Designer是设计时支持,需要另外写一个类库来支持。

(2).ParseChildren指示页分析器应如何处理页上声明的服务器控件标记中嵌套的内容,也就是这个属性决定了Grid内部还可以再嵌套其他内容(为true时才可嵌套),比如Columns。

2.继承自ControlBase,该类后面会介绍。

3.DataSource属性是数据源。

4.Columns是Grid的内部列,其中[Editor(typeof(GridColumnsEditor), typeof(System.Drawing.Design.UITypeEditor))]这个特性非常重要,该特性指示了该属性Columns可以在编辑中编辑。其中GridColumnsEditor是界面编辑的类,后面会介绍。

5.重载Render方法。该方法是将Grid最终html形式输出。这里以table的形式来实现Grid。

(1)将Columns中的所有列的列名以table中的th呈现

(2)将数据源转换成DataTable,然后遍历每一行,并将每一行的数据以td的形式呈现。

下面来看一下ControlBase类。

ControlBase.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI;

namespace AspNetServerControl
{
    public class ControlBase : Control, INamingContainer
    {
    }
}

ControlBase类继承自Control类及INamingContainer接口,这是自定义控件所必须的。

再来看一下NotAllowWhitespaceLiteralsBuilder类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI;

namespace AspNetServerControl
{
    /// <summary>
    /// 控件内部不允许存在非标签形式的字符串
    /// </summary>
    internal class NotAllowWhitespaceLiteralsBuilder : ControlBuilder
    {
        /// <summary>
        /// 不允许空白字符
        /// </summary>
        /// <returns></returns>
        public override bool AllowWhitespaceLiterals()
        {
            return false;
        }

        /// <summary>
        /// 忽略游离于标签外的字符串
        /// </summary>
        /// <param name="s"></param>
        public override void AppendLiteralString(string s)
        {
        }

        public override Type GetChildControlType(string tagName, System.Collections.IDictionary attribs)
        {
            return base.GetChildControlType(tagName, attribs);
        }

    }
}

NotAllowWhitespaceLiteralsBuilder主要是用来控制控件内部不允许存在非标签形式的字符串。

后面将会说明GridColumnsEditor及GridColumn字段的定义,具体请看《Asp.Net服务器控件开发的Grid实现(二)》

时间: 2024-10-11 20:56:34

Asp.Net服务器控件开发的Grid实现(二)的相关文章

Asp.Net服务器控件开发的Grid实现(一)

使用Asp.Net做Web开发时,系统提供的控件,有时难以达成所要的目的.这时,有多种方式可以解决,比如采用html+js的形式,在前端布局出所要的界面,然后再通过ajax等方式去获取数据,以达成目的. 但这样做,很是费劲,特别是当布局出来的界面需要重用的时候,更加费劲.有人,会直接将该界面的代码进行拷贝,但这对后来的维护必然带来更大的问题.所以就考虑,有没有一种方式可以让布局得到重用,又便于维护的.Asp.Net的控件可以很方便的布局,同时又能在后台中直接操作控件,实现相关的数据逻辑.所以就想

Asp.Net服务器控件开发的Grid实现(四)回发事件

在使用Grid的时候,会用到链接跳转.如果只是普通的链接跳转,那只要使用a标签的href就可以实现.但是有时,我们希望在链接跳转的时候,能够引发回发事件,在后台作出一定的处理,然后再跳转.这样要如何实现呢?我们可以定义一个LinkButtonField来实现.代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text;

Asp.Net服务器控件开发的Grid实现(三)

下面是GridColumnsEditor的实现代码: GridColumnsEditor.cs using System; using System.Collections.Generic; using System.ComponentModel.Design; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.UI.WebControls; namespace AspNetS

asp.net服务器控件开发系列一

最近想写写博客记录下自己学习开发服务器控件. 第一步:搭建环境. 1.新建一个项目类库,用于保存控件: 2.新建一个Web工程,用于调用控件: 如图: 第二步:在控件类库下,新建一个服务器控件类TextBox.cs文件.代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; u

ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归.所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然. 但是,如果手写Html标签效率又比较低,可重用度比较低.这时,我们该怎样来提高效率呢?首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码: <input name="UserName&quo

ASP.NET 2.0服务器控件开发的基本概念(转载)

利用ASP.NET 2.0技术,创建Web自定义服务器控件并不是一件轻松的事情.因为,这需要开发人员了解并能够灵活应用多种Web开发技术,例如,CSS样式表.客户端 脚本语言..NET开发语言.服务器控件开发技术,甚至是当前最火的AJAX技术等等.虽然现实如此"艰难",但是这种开发技术也不是真的难到不可掌握. 事事都要从头做起.本文将针对利用asp.net 2.0技术,创建Web自定义服务器控件的基础知识进行详细介绍,内容包括:服务器控件概念.控件类型.生命周期等. 1.ASP.NET

Asp.Net MVC4开发二: Entity Framework在Asp.Net MVC4中的应用

ORM作为一种数据库访问机制已广泛地应用于各种项目当中,在.Net开发中,应用比较广泛的ORM框架大致有下面几个: 官方支持的有:Linq to SQL,Entity Framework.三方的有:NHibernate.前面介绍过Linq to SQL的应用,这篇介绍一下Entity Framework在Asp.Net MVC4中的应用. 首先用Visual Studio(2012或2013,其它版本需要安装Asp.Net MVC4)创建一个Asp.Net MVC4的项目,项目创建完成后会发现E

asp.net 分布式应用开发

Net Framework推出的许多新技术为上述任务的实现提供了相对简单的解决方案.其中,基于SOAP的Web Service在处理分布式应用时具有比传统的DCOM/CORBA明显的优点,结合基于Web的ASP.NET页面开发技术和SQL Server数据存储技术(或Xml文档),在.Net下开发N层应用程序也不再困难. 一.分布式处理概述 分布式处理是将应用程序逻辑分布到2台或者更多台计算机上,在物理上或逻辑上分离的单元中.这一概念并不是新生事物,在大型工程已经得到广泛使用.只不过,Inter

ASP.Net WebForm温故知新学习笔记:二、ViewState与UpdatePanel探秘

原文地址:http://www.cnblogs.com/edisonchou/p/3901559.html 开篇:经历了上一篇<aspx与服务器控件探秘>后,我们了解了aspx和服务器控件背后的故事.这篇我们开始走进WebForm状态保持的一大法宝-ViewState,对其刨根究底一下.然后,再对曾经很流行的ASP.Net AJAX方案中的利器-UpdatePanel这个神奇的区域一探究竟. 一.隐藏的状态-ViewState探秘 1.1 从Http的无状态说起 Http是一个无状态协议,同一