数据绑定,databind()是多么亲切的方法,我们每天很不能敲上几百遍。但是你有木有想过他是如何实现的?有木有!!!(咆哮体:)今天,我们拿Repeater来说说DataBind那些事儿。如果朋友你有看过我写的模版引擎里Label的初级应用的话,我在最后贴了一个List的Label的实现,其中有点意思的就是模仿Repeater。不过看没看过无所谓的。今天我们看看微软人家正儿八经的Repeater。
一般控件的绑定我们都是在Page_Load事件方法里这么写
if(!IsPostBack)
{
BindList();
}
public void BindList()
{
lst.DataSource = DataHelper.GetList();
lst.DataBind();
}
第一步就是我们给DataSource成员赋值,看看赋值的时候发生了什么?
public virtual object DataSource
{
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
get
{
return this.dataSource;
}
set
{
if (((value != null) && !(value is IListSource)) && !(value is IEnumerable))
{
throw new ArgumentException(SR.GetString("Invalid_DataSource_Type", new object[] { this.ID }));
}
this.dataSource = value;
this.OnDataPropertyChanged();
}
}
从上面的方法中我们可以看出DataSource还真不简单,一个赋值就干了很多事,其实get和set是两个方法(get_dataSource、set_dataSource),只是C#里这么写比较好看些。
如果我们指定的datasource不是IEnumerable(可迭代),不是IListSource类型,则抛出异常(参数错误:无效的数据源),说明肯定要用到IListSource的方法,而且要循环使用(Repeater肯定的循环啊)。
然后执行了OnDataPropertyChanged()的方法。看名字就能猜到该方法就是一个地下党,他会告诉类里面的某些成员说:“嘿,伙计,数据源变啦,各单位注意!”,这时候Repeater去获取数据的时候会问这个地下党:”哥们,现在风头紧不紧。。。“
protected virtual void OnDataPropertyChanged()
{
if (this._throwOnDataPropertyChange)
{
throw new HttpException(SR.GetString("DataBoundControl_InvalidDataPropertyChange", new object[] { this.ID }));
}
if (this._inited)
{
this.RequiresDataBinding = true;
}
this._currentViewValid = false;
}
第一句抛出异常就是”内部组织“决定杀人灭口,根本没机会了。第二句,_inited,是否初始化过,_currentViewValid,意思是当前的DataView是否验证过?(意思是这数据源来源不明啊)
第二句话就是执行DataBind()了,DataBind就会用到上面的”地下组织“。
public override void DataBind()
{
if ((!this.IsBoundUsingDataSourceID || !base.DesignMode) || (base.Site != null))
{
this.RequiresDataBinding = false;
this.OnDataBinding(EventArgs.Empty);
}
}
就是说是否使用DataSourceID来绑定? 显然我们不是,我们直接给定的数据源。 如果指定了DataSourceID,在Render Repea