数据绑定,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 Repeater时会搜寻名字为DataSourceID的DataSource控件。这是一种前台指定数据源的方式。不过最终都是要执行DataBind。我们来看Repeater的OnD

本文探讨了ASP.NET中的DataBind方法,以Repeater控件为例,阐述数据绑定的原理。在Page_Load事件中,DataBind()方法用于将数据源与控件关联。通过CreateItem方法生成ItemTemplate,并在RepeaterItem的DataBind中完成具体的数据绑定。文章还提及了嵌套数据绑定的处理,并对比了自定义模板引擎与WebForm的相似之处,强调重复造轮子对于深化理解的重要性。
最低0.47元/天 解锁文章
484

被折叠的 条评论
为什么被折叠?



