Asp.Net服务器控件开发的Grid实现(二)Html标记渲染
我們先來實現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
再來看一下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标记渲染的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery选择器 (详解)
- 下一篇: [WPF]WPF开发方法论