我们先来实现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 DataSourceprivate object _dataSource;public object DataSource{get { return _dataSource; }set { _dataSource = value; }}#endregion#region Columnsprivate 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#endregionprotected 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实现(二)》

转载于:https://www.cnblogs.com/sparkleDai/p/7604984.html

Asp.Net服务器控件开发的Grid实现(二)Html标记渲染相关推荐

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

    下面是GridColumnsEditor的实现代码: GridColumnsEditor.cs using System; using System.Collections.Generic; usin ...

  2. Asp.net服务器控件开发系列文章 汇总

    简介:         Asp.net包含一个页面和控件框架,即WebForms,服务器控件是WebForms编程模型的基本要素,控件简化了页面开发的过程,控件为代码复用和封装提供了一种机制,非常适合 ...

  3. ASP.NET服务器控件开发(2)--继承WebControl类

    文章作者:高维鹏(Brian) 文章出处:http://www.cnblogs.com/gaoweipeng 前篇文章简单介绍了如何封装Html来创建我们的ASP.NET服务器控件.这篇说说如何继承A ...

  4. ASP.NET服务器控件的生命周期分析

    本文实例分析了ASP.NET服务器控件的生命周期.分享给大家供大家参考.具体如下: (1)初始化----在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置:二.跟踪视图状态. ...

  5. 服务器控件开发之基本概念

    利用ASP.NET 2.0技术,创建Web自定义服务器控件并不是一件轻松的事情.因为,这需要开发人员了解并能够灵活应用多种Web开发技术,例如,CSS样式表.客户端脚本语言..NET开发语言.服务器控 ...

  6. asp.net 分布式应用开发

    Net Framework推出的许多新技术为上述任务的实现提供了相对简单的解决方案.其中,基于SOAP的Web Service在处理分布式应用时具有比传统的DCOM/CORBA明显的优点,结合基于We ...

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

    原文地址:http://www.cnblogs.com/edisonchou/p/3901559.html 开篇:经历了上一篇<aspx与服务器控件探秘>后,我们了解了aspx和服务器控件 ...

  8. 使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享

    使用Jquery+EasyUI 进行框架项目开发案例讲解之二 用户管理源码分享  在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享>我们分享了 ...

  9. .NET程序设计 实验名称 实验六 ASP.NET服务器控件

    计算机学院实验报告 课程名称 .NET程序设计 实验名称 实验六 ASP.NET服务器控件 1.熟悉用户控件的使用. 2.熟悉导航控件的使用. 3.掌握母版页的使用. 二.实验内容: 本实验将通过创建 ...

最新文章

  1. python HDF5 h5py 的用法
  2. 移动app部分机型无法唤起h5支付宝支付_案例分析:H5支付交互体验设计
  3. Android C组件的经济意义
  4. 设计模式:外观模式(Facade)
  5. android 讯飞语音评测,讯飞语音评测demo
  6. java 文件监听器_java7 文件监听器
  7. 11g下如何查询trace文件名
  8. iframe页面里的链接在ios设备无法点击的解决办法
  9. HttpReponse
  10. (FPGA学习)环境及入门-------基于黑金FPGA cyclone IV EP4CE15F17开发板
  11. 如何制作一寸、二寸、六寸照片。以后不用再去照相馆了!!! 转~版本更新...
  12. 【Android】Doze模式识别与检测
  13. CryEngine5 Shader调试
  14. 微信小程序开发学习笔记一
  15. MySQL变量的使用
  16. JavaSE学习笔记(一)基础知识
  17. 【DNN】PNN(Product-based Neural Networks )
  18. 用本机VM虚拟机作为网站的服务器
  19. 怀旧服湖畔镇服务器位置,蓝贴:怀旧服合服的服务器!
  20. all在java语言什么意思_this什么意思

热门文章

  1. # PHP - 使用PHPMailer发邮件
  2. eclipse和myeclipse中如何关闭自动补全括号,花括号,双引号等功能
  3. zabbix搭建并结合mikoomi插件监控hadoop集群
  4. jquery总结_代码收藏
  5. PHP支付接口教程,详解微信支付(二)
  6. 《软件工艺师:专业、务实、自豪》一第3章
  7. 解决Ubuntu 14下,PhpStorm 9.x 编辑器界面中文乱码的问题
  8. 恢复联想键盘F1-F12标准模式
  9. Redis学习笔记(11)——Redis缓存集群方案
  10. CentOS安装rpm包时遇到Header V3 DSA signature: NOKEY时解决办法