以下是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 AspNetServerControl { public class GridColumnsEditor : CollectionEditor { private Type[] types; /// <summary> /// 构造函数 /// </summary> /// <param name="type">控件类型</param> public GridColumnsEditor(Type type) : base(type) { types = new Type[] { typeof(BoundField) }; } /// <summary> /// 获取此集合编辑器可包括的数据类型 /// </summary> /// <returns>类型集合</returns> protected override Type[] CreateNewItemTypes() { return types; } } }GridColumnsEditor继承自CollectionEditor,CollectionEditor能够给用户提供一个编辑的界面,并集合大部分的数据类型。
在构造函数中GridColumnsEditor(Type type)中,仅仅实现了一个BoundField字段,假设须要其它的字段,能够在后面加入。比方
types = new Type[] { typeof(BoundField), typeof(CheckField) };以下看一下BoundField字段的实现
/// <summary> /// 表格数据绑定列 /// </summary> [ToolboxItem(false)] [ParseChildren(true)] [PersistChildren(false)] public class BoundField : GridColumn { }BoundField继承自GridColumn类,这里也有一个ParseChildren属性,主要是为了嵌套。
以下看一下GridColumn的实现
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web.UI; namespace AspNetServerControl { /// <summary> /// 表格列基类(抽象类) /// </summary> [ToolboxItem(false)] [ParseChildren(true)] [PersistChildren(false)] [DefaultProperty("HeaderText")] public class GridColumn : ControlBase { private string _headerText = String.Empty; /// <summary> /// 标题栏显示的文字 /// </summary> [Category(CategoryName.OPTIONS)] [DefaultValue("")] [Description("标题栏显示的文字")] public string HeaderText { get { return _headerText; } set { _headerText = value; } } private string _dataField = String.Empty; /// <summary> /// 字段名称 /// </summary> [Category(CategoryName.OPTIONS)] [DefaultValue("")] [Description("字段名称")] public string DataField { get { return _dataField; } set { _dataField = value; } } } }GridColumn也继承自ControlBase,所以GridColumn事实上也是一个控件,仅仅只是我们将其嵌套在了Grid中。
在Grid中定义Columns的属性时,我们用的是GridColumnCollection类,而该类是一个GridColumn的集合,代码例如以下。
public class GridColumnCollection : Collection<GridColumn> { public GridColumnCollection(ControlBase parent) { } }
再看GridColumn类中,我们定义了HeaderText和DataField属性,这两个属性就是我们在default.aspx页面中编辑Grid时,给BoundField加入的属性。
到此,整个Grid的封装就算完毕了。
假设结合jquerymobile,能够在Grid的Render函数中,根据jquerymobile的表格标记输出。
对于Grid的回发事件处理,请參看《Asp.Netserver控件开发的Grid实现(四)回发事件》