1. 引言
以上几个任务里,我们创建了一些简单但很实用的自定义控件,但是它们只能按照固定的设置进行呈现,缺少一些关键的特征——数据绑定和有时为了更灵活的控制以支持模版设置。在ASP.NET数据绑定控件分为三种:
简单数据绑定:简单数据绑定将一个对象与某个控件的属性绑定在一起。数据源只是绑定单个数据项,而不是绑定一个数据项列表。简单数据绑定使用数据绑定表达式完成,数据绑定表达式是用<%#...%>封装的任何可执行代码。
列表控件:列表控件是通过一个固定不变的用户界面显示一个数据项列表的控件。常见的列表控件包含RadioButtonList控件、CheckBoxList控件和ASP.NET2.0中新引入的BulletedList控件。
复杂数据绑定:复杂数据绑定控件通常是显示一组数据项的组合控件,它们有着灵活的呈现机制,例如GridView控件就是一个复杂数据绑定控件。
为了使星级控件在使用时能够通过某个数据源显示数据,需要使该控件拥有数据绑定的能力,使用时数据绑定方法代码看起来可能如下所示:
private void BindData()
{
DataTable table = new DataTable();
DataColumn col = new DataColumn("Comment",typeof(string));
table.Columns.Add(col);
col = new DataColumn("Score",typeof(int));
table.Columns.Add(col);
DataRow row = table.NewRow();
row[0] = "Vista";
row[1] = 3;
table.Rows.Add(row);
table.AcceptChanges();
star.DataSource = table;
star.DataTextField = "Comment";
star.DataValueField = "Score";
star.DataBind();
}
2. 分析
在开始列表控件之前再来讨论一下简单数据绑定,前几次开发的星级控件就是一个简单数据绑定控件,我们直接可以为他的某个属性使用数据绑定表达式赋值,例如在StartTest.aspx中编写如下代码使用自定义控件:
<cc:Star ID="star" runat="server" Score="4" Comment="<%#DateTime.Now%>" Font-Size="12px" />
在页面中预览——很不巧,当前日期并没有显示在页面上,这是由于在页面中定义的任何数据绑定表达式,只有在调用DataBound方法之后才会进行计算。我们有多种选择,既可以调用页面对象(Page)的DataBind方法,也可以调用具体控件上的DataBind方法,实际上,如果调用页面对象上的DataBind方法,它将递归的调用页面中定义的所有控件上的DataBind方法。这就意味着,如果页面上使用了多个数据绑定表达式,最好还是通过调用Page.DataBind方法执行数据绑定。
如果想了解在数据绑定时底层究竟执行了什么操作,可以打开ASP.NET的调试功能,并改变临时文件目录,修改web.config中complcation配置节如下所示:
<compilation debug="true" tempDirectory="c:\web">
…… ……
</complation>