(3)页面代码
下面实现效果跟2.2的定义的模板控件效果一样,这里只为说明默认模板的使用方法
void Page_Load()
{
ArticleWithDefault1.Title = "Creating Templated Databound Controls";
ArticleWithDefault1.Author = "Stephen Walther";
ArticleWithDefault1.Contents = "Blah, blah, blah, blah";
ArticleWithDefault1.DataBind();
}
<custom:ArticleWithDefault
id="ArticleWithDefault1"
Runat="server" />
2.4实现自定义容器控件
上面我已经多次注明容器控件为默认自身控件,你可以通过自定义容器控件
GridView控件会自动把数据以表格形式呈现,DataList控件有DataListItem ,Repeater则有RepeaterItem.
这些控件实现数据绑定后,通常不是显示一条数据的,其控件都有一个Items属性,其表示项集合.
每项数据都在其Item里面,看一下DataList绑定数据以后的控件树
我们常常会需要在模板控件里以以下方式来获取模板内部控件
如在DataList控件中
protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
{
e.Item.FindControl("");
DataList1.Items[0].BackColor = System.Drawing.Color.Red;
}
通过此方法我们可以处理一些特殊的列和行.为实现上面效果,我们也可以为模板控件自定义容器控件
(1)自定义容器控件类
注意需要实现IDataItemContainer接口,就如DataList一样,其绑定的数据不可能是一条的.
public class ProductItem : WebControl, IDataItemContainer
{
private string _name;
private decimal _price;
public string Name
{
get { return _name; }
set { _name = value; }
}
public decimal Price
{
get { return _price; }
set { _price = value; }
}
public object DataItem
{
get
{
return this;
}
}
public int DataItemIndex
{
get { return 0; }
}
public int DisplayIndex
{
get { return 0; }
}
}
然后在主控件中如下实现
private ProductItem _item;
public string Name
{
get
{
EnsureChildControls();
return _item.Name;
}
set
{
EnsureChildControls();
_item.Name = value;
}
}
public Decimal Price
{
get
{
EnsureChildControls();
return _item.Price;
}
set
{
EnsureChildControls();
_item.Price = value;
}
}
(2)用TemplateContainer与模板属性关联起来
[TemplateContainer(typeof(ProductItem))]
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate ItemTemplate
{
get { return _itemTemplate; }
set { _itemTem