一 给控件提供支持绑定数据源的功能
要实现很简单只有从新类 CompositeDataBoundControl 派生并实现CreateChildControls方法就可以了
先做一个简单的例子理解一下这个类的使用
代码
using System;
using SystemCollections;
using SystemCollectionsGeneric;
using SystemWeb;
using SystemWebUI;
using SystemWebUIWebControls;
namespace XLSoftWebControls
{
public class MyDataGrid : CompositeDataBoundControl
{
public string DataName
{
get
{
object o = ViewState[DataName];
if (o == null)
return ;
return (string)o;
}
set { ViewState[DataName] = value; }
}
protected override int CreateChildControls(IEnumerable dataSource bool dataBinding)
{
int itemCount = ;
if (dataBinding)
{
foreach (object obj in dataSource)
{
Label lbl = new Label();
lblText = DataBinderGetPropertyValue(obj DataName)ToString() + | ;
ControlsAdd(lbl);
itemCount++;
}
}
return itemCount;
}
}
}
<MYUI:MyDataGrid ID=MyDataGrid runat=server DataName=text />
代码
protected void Page_Load(object sender EventArgs e)
{
DataTable dt = new DataTable();
dtColumnsAdd(text);
DataRow dr = dtNewRow();
dr[] = ;
DataRow dr = dtNewRow();
dr[] = ;
dtRowsAdd(dr);
dtRowsAdd(dr);
thisMyDataGridDataSource = dt;
thisMyDataGridDataBind()
}
二 添加多列的属性
上面的实验只是做了实现数据源控件的功能如果是要做表格控件其中的label就可以换成TableRow 并添加到Table这样同样可以做出表格不过只有一列(DataName)当然可以把多个列名合并放在DataName中考虑到列可能会有其他属性比如HeaderText这样做并不合理于是换成 Colunms集合对象
代码
public class MyColunm
{
public MyColunm() { }
public MyColunm(string name string headertext string format)
{
this_name = name;
this_headerText = headertext;
this_format = format;
}
private string _name;
private string _headerText;
private string _format;
public string Format
{
get { return _format; }
set{ _format = value; }
}
public string HeaderText
{
get { return _headerText; }
set { _headerText = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
public class MyColunmCollection : List<MyColunm>{}
public class MyDataGrid : CompositeDataBoundControl
{
private MyColunmCollection _colunms = new MyColunmCollection();
public MyColunmCollection Colunms
{
get { return _colunms; }
}
protected override int CreateChildControls(IEnumerable dataSource bool dataBinding)
{
Table table = new Table();
if (dataBinding)
{
TableHeaderRow trHeader = new TableHeaderRow();
foreach (MyColunm col in Colunms)
{
TableHeaderCell cell = new TableHeaderCell();
cellText = colHeaderText;
trHeaderCellsAdd(cell);
}
tableRowsAdd(trHeader); //Add Header Row
foreach (object obj in dataSource)
{
TableRow tr = new TableRow();
foreach (MyColunm col in Colunms)
{
TableCell cell = new TableCell();
if (stringIsNullOrEmpty(colFormat))
cellText = DataBinderGetPropertyValue(obj colName)ToString();
else
cellText = DataBinderGetPropertyValue(obj colName colFormat);
trCellsAdd(cell);
}
tableRowsAdd(tr);
}
}
ControlsAdd(table);
return ;
}
}
三添加子标签
简单来说添加特性ParseChildren(trueColunms)就可以把子标签作为属性填充到Colunms中
关于ParseChildrenMSDN有这样的解释:
:在开发ASPNET 服务器控件时ParseChildrenAttribute 类指示页分析器应如何处理页上声明的服务器控件标记中嵌套的内容
:ParseChildrenAttribute 类允许您以 ParseChildrenAttribute 元数据属性标记服务器控件来为自定义服务器控件指定分析逻辑
:以元数据属性 (Attribute) ParseChildren(true) 标记服务器控件将指示分析器把包含在服务器控件标记内的元素解释为属性 (Property)
:以元数据属性 (Attribute) ParseChildren(true<Default Property>) 标记服务器控件将把 DefaultProperty 属性 (Property) 设置为传递到该属性 (Attribute) 的属性 (Property) 名称
:以元数据属性 ParseChildren(false)(默认值)标记服务器控件将指示分析器把包含在服务器控件标记中的元素解释为将通过关联的 ControlBuilder 进行分析的内容即解释为控件