对 Web 窗体页中的各项控件属性进行数据绑定不是通过直接将属性绑定到数据源来实现的。而是通过使用特殊的表达式格式来实现数据绑定的。与要绑定到的数据有关的信息被置入该表达式,然后将表达式的结果分配给控件属性。
例如,假设您要将 TextBox Web 服务器控件绑定到一些数据。您创建数据绑定表达式并将其分配给控件的 Text 属性,以便该值将在控件中显示。
下面的示例说明控件声明在 HTML 视图中的大体形式。控件的 Text 属性被绑定到包含单个记录的数据视图。数据绑定表达式是用字符 <%# 和 %> 分隔的。
<asp:TextBox id="TextBox1" runat="server"
Text='<%# DataView1(0)("au_lname") %>'>
</asp:TextBox>
同样,可以使用数据绑定表达式来设置 Image Web 服务器控件的 ImageUrl 属性。在这种情况下,您是在从数据库中提取一个字符串,该字符串包含要显示的图形的路径和文件名。一个示例可能类似于如下所示:
<asp:Image id=Image1 runat="server"
ImageUrl='<%# DataView(0)("productPhotoURL") %>'>
在 Visual Studio 中,“属性”窗口向您提供创建数据绑定表达式的工具。您还可以选择自行创建绑定表达式并在 Web 窗体设计器的 HTML 视图中输入它们。
使用数据绑定表达式的优点使用数据绑定表达式在以下几个方面为您提供灵活性:
可以使用任何表达式,只要该表达式解析为控件可以使用的值。最常见的是,数据绑定表达式将解析为从数据源导出的值,但它还可以引用该页或其他控件的属性、您在运行时计算出的值或几乎任何其他项。 可以将表达式分配给任何属性,也就是说,可以将任何属性绑定到数据。例如,您可以将与用户首选项有关的信息保留在数据库中,并且使用数据绑定为字体、颜色、大小、样式等实现属性中的那些首选项。此外,可以绑定不止一个控件属性,这使您可以将一个属性绑定到一个数据源,将另一个属性绑定到不同的源。 使用 DataBinder 类用于绑定尽管您可以实际使用解析为一个值的任何表达式来进行数据绑定,但在大多数情况下,您将绑定到某些类型的数据源。最为常见的情况是数据集或数据视图中的表,表中包含您感兴趣的单个记录。为了简化此类型的数据绑定,ASP.NET 服务器控件支持名为 DataBinder 的类,它执行某些提取数据并使其可用于控件属性的工作。
可以通过调用其 Eval 方法来使用 DataBinder 类,这要求两个参数:
对数据容器(通常是数据集)、数据表或数据视图的引用。 对要被导出的单独的值的引用。这通常引用单行(行零)和该行中的列值。 下面的示例说明与上面的文本框所执行的相同的数据绑定,但这一次使用 DataBinder 类。
<asp:TextBox id="TextBox1" runat="server"
Text='<%# DataBinder.Eval(DataView1, "[0].au_lname") %>'>
</asp:TextBox>
先前设置 Image 控件 ImageUrl 属性的示例可能类似于如下所示。在该示例中,一个格式设置表达式在 DataBinder.Eval 方法的第二个参数(可选)中传递;该表达式将一个路径当作前缀添加到数据中。
<asp:Image id=Image1 runat="server"
ImageUrl='<%# DataBinder.Eval(Container, "DataItem.ProductImage", "http://myserver/myapps/images/{0}") %>'>
使用 DataBinder 类的优点是:
语法对于所有绑定是一致的,由 Eval 方法所需的参数强制采用的。 Web 窗体页的 Visual Studio 设计工具支持 DataBinder 类。 类自动执行类型转换。例如,如果将一个文本框绑定到包含整数的数据列,DataBinder 类自动将整数转换为字符串。 您可以选择指定一个可转换或修正数据的格式设置表达式。 解析数据绑定表达式为了提供控件可以绑定到的值,必须在运行时解析数据绑定表达式。通过调用 DataBind 方法(它是 System.Web.UI.Control 类的方法),可以在页处理期间显式执行此步骤。可以为单独的控件调用该方法,或者更为有效的是,可以为 Page 类(也是从 Control 类导出的)调用该方法。此方法级联对所有子控件的调用,所以通过为该页调用此方法一次,您可以为该页上的所有控件调用它。
通常在以下情况下调用 DataBind 方法:
该页第一次运行时,但在填充数据源之后(例如,在您已填充数据集之后)。 在数据源发生更改之后(例如,因为已更新了数据源中的记录)。 下面的示例说明在页初始化事件期间调用 DataBind 方法的典型方式:
' Visual Basic
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SqlDataAdapter1.Fill(DsAuthors1, "authors")
If Not (Me.IsPostBack) Then
Me.DataBind()
End If
End Sub
// C#
private void Page_Load(object sender, System.EventArgs e)
{
SqlDataAdapter1.Fill(dsAuthors1, "authors");
if (!this.IsPostBack)
{
this.DataBind();
}
}
通常不需要在每个往返过程中都调用 DataBind 方法(即在页初始化中不需要检查回发),因为这样做会替换控件中的值。例如,如果您使用 DataGrid 控件,该控件可能包含您要处理的更改。在您调用 DataBind 时,用来自数据源的值代替网格的内容。如果在页初始化期间执行此操作,您将在有机会处理更改前,失去网格中的更改。您而是应通常在为该事件执行了数据处理后,在事件处理程序中调用 DataBind 方法。