做b/s的,经常要对数据操作,大部分是添加、修改、删除、查询 这样的操作,对于查询表现到界面上就是数据列表。最常用的控件就是DataList DataGrid Repeater这些数据绑定控件。其中Repeater是我最常用的,因为他生成的代码最少,自定义功能也强。大多时候就是拖控件,在ItemTemplate项里面加上html的样式,在需要显示数据的地方放上Literal,然后在ItemDataBound里面写数据绑定的代码。天天重复的劳动,特别是在ItemTemplate中需要绑定项目多的时候,常常让我厌烦。有没有什么办法让程序自己给你做这些事情呢?
其实很简单就能实现,重写Repeater控件,让ItemDataBound事件自动遍历ItemTemplate中的控件,然后自己按照控件名字绑定数据。
protected override void OnItemDataBound(RepeaterItemEventArgs e)
{
if (e.Item.ItemIndex >= 0)
{
foreach (Control var in e.Item.Controls)
{
if (var.ID != null)
{
string text = "";
if (e.Item.DataItem.GetType().Name == "DataRowView")
{
DataRowView dr = (e.Item.DataItem as DataRowView);
if (dr.DataView.Table.Columns.Contains(var.ID))
text = dr[var.ID].ToString();
}
switch (ControlType.Name)
{
case "Literal":
(var as Literal).Text = text;
break;
case "Image":
(var as Image).ImageUrl = text;
break;
}
}
}
}
base.OnItemDataBound(e);
}
{
if (e.Item.ItemIndex >= 0)
{
foreach (Control var in e.Item.Controls)
{
if (var.ID != null)
{
string text = "";
if (e.Item.DataItem.GetType().Name == "DataRowView")
{
DataRowView dr = (e.Item.DataItem as DataRowView);
if (dr.DataView.Table.Columns.Contains(var.ID))
text = dr[var.ID].ToString();
}
switch (ControlType.Name)
{
case "Literal":
(var as Literal).Text = text;
break;
case "Image":
(var as Image).ImageUrl = text;
break;
}
}
}
}
base.OnItemDataBound(e);
}
很简单吧,在switch里面可以按照你的要求加任意的控件类型。只要你ItemTemplate中的控件ID和DataSet中的名称一样就自动绑定。如果不一样就不管啦。你还是可以在aspx里面做二次处理。
不过这里有个问题,只能处理数据源是Dataset的,现在都流行orm了,后台都有代码生成器了,难道前台还要自己写代码吗?
现在就可以拿出我们asp.net的利器啦。【反射】太棒的功能了,让我们可以做更多的事情。其实思路也是类似的留到下一篇写吧!:-)