一, 给控件提供支持绑定数据源的功能
要实现很简单,只有从新类 CompositeDataBoundControl 派生,并实现CreateChildControls方法就可以了。
先做一个简单的例子理解一下这个类的使用:
代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace XLSoft.WebControls
{
public class MyDataGrid1 : 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 = 0;
if (dataBinding)
{
foreach (object obj in dataSource)
{
Label lbl = new Label();
lbl.Text = DataBinder.GetPropertyValue(obj, DataName).ToString() + " | ";
Controls.Add(lbl);
itemCount++;
}
}
return itemCount;
}
}
}
<MYUI:MyDataGrid1 ID="MyDataGrid11" runat="server" DataName="text" />
代码
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("text");
DataRow dr1 = dt.NewRow();
dr1[0] = "111";
DataRow dr2 = dt.NewRow();
dr2[0] = "222";
dt.Rows.Add(dr1);
dt.Rows.Add(dr2);
this.MyDataGrid11.DataSource = dt;
this.MyDataGrid11.DataBind()
}
二, 添加多列的属性
上面的实验只是做了实现数据源控件的功能,如果是要做表格控件,其中的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;
}