trol6();
5: IParserAccessor accessor = __ctrl;
6: accessor.AddParsedSubObject(control);
7: }
8:
在这个函数里,调用了另一个私有函数this.__BuildControl__control6,这个函数返回的一个 DataBoundLiteralControl对象,并将对象输出添加到__ctrl参数。事实上,只要我们去阅读 CompiledTempateBuilder就发现在,这里的__ctrol对象就是我们在实例化模板时传入的对象,也就是 ITemplate中的InstantiateIn方法的那个container参数对象。
为什么使用的是AddParsedSubObject方法,使用这个方法添加子控件相当于告诉父控件,这是一个已 经解析好的子控件对象,不需再去将控件解析成HTML代码,而在输出时直接输出Text属性的值即可。从这 里我们还可以得知DataBoundLiteralControl的对象,事实上就是承担了字符串拼接的职责,这一点我们 可以在后面的分析中得以验证。
__BuildControl__control6私有函数的定义如下:
1: [DebuggerNonUserCode]
2: private DataBoundLiteralControl __BuildControl__control6()
3: {
4: DataBoundLiteralControl control = new DataBoundLiteralControl(5, 4);
5: control.TemplateControl = this;
6: control.SetStaticString(0, "\r\n <tr>\r\n <td>\r\n ");
7: control.SetStaticString(1, "\r\n </td>\r\n <td>\r\n ");
8: control.SetStaticString(2, "\r\n </td>\r\n \r\n <td>\r\n ");
9: control.SetStaticString(3, "\r\n </td>\r\n <td>\r\n ");
10: control.SetStaticString(4, "\r\n </td>\r\n </tr>\r\n ");
11: control.DataBinding += new EventHandler(this.__DataBind__control6);
12: return control;
13: }
在这个函数里面,创建了一个DataBoundLiteralControl对象,并将页面上定义的模板的静态HTML代码 添加到该的静态字符串数组里,并且设置了它的绑定事件代理函数__DataBind__control6,该函数的定义 :
1: public void __DataBind__control6(object sender, EventArgs e)
2: {
3: DataBoundLiteralControl control = (DataBoundLiteralControl) sender;
4: RepeaterItem bindingContainer = (RepeaterItem) control.BindingContainer;
5: control.SetDataBoundString(0, Convert.ToString(base.Eval("ID"), CultureInfo.CurrentCulture));
6: control.SetDataBoundString(1, Convert.ToString (base.Eval("电流{a}"), CultureInfo.CurrentCulture));
7: control.SetDataBoundString(2, Convert.ToString(base.Eval("备注''"), CultureInfo.CurrentCulture));
8: control.SetDataBoundString(3, Convert.ToString (base.Eval("名称]"), CultureInfo.CurrentCulture));
9: }
在这个函数中,我们看到了真正的数据绑定代码了,它调用了TemplateControl的Eval方法来将当前数 据项的相应字段的值取出,并按一定的格式转化后添加到DataBoundLitreralControl对象中,并在 DataBoundLiteralControl将StaticString和DataBoundString字符串数组按一定的顺序拼接起来,作为 Text属性的输出值。而容器控件则直接向客户端输这段HTML。
下面,我们还有必要来分析下TemplateControl中的Eval方法,这个方法有两种重载,简单起见,我们 来分析较为简单的重载:
1: protected internal object Eval(string expression)
2: {
3: this.CheckPageExists();
4: return DataBinder.Eval(this.Page.GetDataItem(), expression);
5: }
这个方法,使用 |