下面是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.Net服务器控件开发的Grid实现(四)回发事件》