MORE INFORMATION
With ASP.NET data binding, you can bind any server control
to simple properties, collections, expressions and/or methods. When you use
data binding, you have more flexibility when you use data from a database or
other means.
This article addresses the following data binding
topics:
Data binding essentials
<%# %> Syntax
ASP.NET introduces a new declarative syntax, <%# %>. This
syntax is the basis for using data binding in an .aspx page. All data binding
expressions must be contained within these characters. The following list
includes examples of simple data binding from multiple sources:
- Simple property (syntax for a customer):
<%# custID %>
- Collection (syntax for an order):
<asp:ListBox id="List1" datasource='<%# myArray %>' runat="server">
- Expression (syntax for a contact):
<%# ( customer.First Name + " " + customer.LastName ) %>
- Method result (syntax for the outstanding balance):
<%# GetBalance(custID) %>
In the preceding examples, the inline <%# %> tags
indicate where the information from a specific data source is to be placed in
the .aspx page. The following data binding example uses a
TextBox Web server control:
<asp:textbox id=txt text="<%# custID %>" runat=server />
For more information about data binding syntax, see the following
.NET Framework Software Development Kit (SDK) documentation:
Page.DataBind() versus Control.DataBind()
After the particular data sources have been determined and set
for the objects on the .aspx page, you must bind the data to these data
sources. You can use the
Page.DataBind or the
Control.DataBind method to bind the data to the data sources.
Both
methods work similarly. The main difference is that all data sources are bound
to their server controls after the
Page.DataBind method is called. No data is rendered to the control until you
explicitly call either the
DataBind method of the Web server control or until you invoke the
page-level
Page.DataBind method. Typically,
Page.DataBind (or
DataBind) is called from the
Page_Load event.
For more information about the
DataBind method, see the following .NET Framework SDK documentation:
Control.DataBind Method
http://msdn.microsoft.com/library/default.asp?url=/library/en-us
/cpref/html/frlrfSystemWebUIControlClassDataBindTopic.aspData-bound list controls
The list controls are special Web server controls that can bind
to collections. You can use these controls to display rows of data in a
customized template format. All list controls expose the
DataSource and the
DataMember properties, which are used to bind to collections.
These controls can bind their
DataSource property to any collection that supports the
IEnumerable, the
ICollection, or the
IListSource interface.
Repeater control
The
Repeater control is a templated, data-bound list. The
Repeater control is "lookless;" that is, it does not have any built-in
layout or styles. Therefore, you must explicitly declare all HTML layout,
formatting, and style tags in the control's templates.
The following
code samples demonstrate how you can use one list control, the
Repeater control, to display data:
NOTE: You must modify the parameters of the connection string as
necessary for your environment.
Visual Basic .NET
<%@ Page Language="vb" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _
"database=pubs;Integrated Security=SSPI")
Dim cmd As SqlDataAdapter = New SqlDataAdapter("select * from authors", cnn)
Dim ds As DataSet = New DataSet()
cmd.Fill(ds)
Repeater1.DataSource = ds
Repeater1.DataBind()
End Sub
</script>
<html>
<body>
<form id="Form1" method="post" runat="server">
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"au_id") %><br>
</ItemTemplate>
</asp:Repeater>
</form>
</body>
</html>
Visual C# .NET
<%@ Page language="c#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
SqlConnection cnn = new
SqlConnection("server=(local);database=pubs;Integrated Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "authors");
Repeater1.DataSource = ds.Tables["authors"];
Repeater1.DataBind();
}
</script>
<html>
<body>
<form id="WebForm2" method="post" runat="server">
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"au_id") %><br>
</ItemTemplate>
</asp:Repeater>
</form>
</body>
</html>
Visual J# .NET
<%@ Page language="VJ#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
SqlConnection cnn = new SqlConnection("server=(local);database=pubs;Integrated
Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn);
DataSet ds = new DataSet();
da.Fill(ds, "authors");
DataTableCollection dtc = ds.get_Tables();
int index = dtc.IndexOf("authors");
Repeater1.set_DataSource(dtc.get_Item(index));
Repeater1.DataBind();
}
</script>
<html>
<body>
<form id="WebForm2" method="post" runat="server">
<asp:Repeater id="Repeater1" runat="server">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem,"au_id") %><br>
</ItemTemplate>
</asp:Repeater>
</form>
</body>
</html>
For more information about the
Repeater control, see the following .NET Framework SDK documentation:
DataList control
The
DataList class is a feature-rich, templated, data-bound list. You can
modify the templates to customize this control. Unlike the
Repeater control,
DataList supports directional rendering and can optionally render in an
HTML table at run time.
For more information about the
DataList control, see the following .NET Framework SDK documentation:
DataGrid control
The
DataGrid control is a fully featured, multicolumn, data-bound grid. To
customize the layout of individual columns in the
DataGrid, you can set the column type to "templated" and modify the
column's templates. The
DataGrid control can render without templates, which makes this control
ideal for reporting scenarios.
DataGrid also supports selection, editing, deletion, paging, and sorting
by column and button columns.
For more information about the
DataGrid control, see the following .NET Framework SDK documentation:
Accessing data
This section describes how to access data from a database and
bind the data to list controls. You can use the
DataSet or the
DataReader class to obtain data from a database.
DataSet class
A
DataSet contains a complete representation of data, including the table
structure, the relationships between tables, and the ordering of the data.
DataSet classes are flexible enough to store any kind of information from
a database to an Extensible Markup Language (XML) file.
DataSet classes are stateless; that is, you can pass these classes from
client to server without tying up server connection resources. The following
code demonstrates how to use a
DataSet to bind data to a control:
NOTE: You must modify the parameters of the connection string as
necessary for your environment.
Visual Basic .NET
Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _
"database=pubs;Integrated Security=SSPI")
Dim cmd As SqlDataAdapter = New SqlDataAdapter("select * from authors", cnn)
Dim ds As DataSet = New DataSet()
cmd.Fill(ds)
MyRepeater.DataSource = ds
MyRepeater.DataBind()
Visual C# .NET
SqlConnection cnn = new SqlConnection("server=(local);
database=pubs;Integrated Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn);
DataSet ds = new DataSet();
da.Fill(ds);
MyRepeater.DataSource = ds;
MyRepeater.DataBind();
Visual J# .NET
SqlConnection cnn = new SqlConnection("server=(local);
database=pubs;Integrated Security=SSPI");
SqlDataAdapter da = new SqlDataAdapter("select * from authors", cnn);
DataSet ds = new DataSet();
da.Fill(ds);
MyRepeater.set_DataSource(ds);
MyRepeater.DataBind();
For more information about the
DataSet class, see the following .NET Framework SDK documentation:
DataReader class
Conversely, if you only need to display (and not change) the data
that is to be rendered, a
DataReader class may be a better solution. For example, it is better to use
a
DataReader for a
DropDownList control because the
DataReader is a forward-only data cursor. The following code demonstrates
how to use a
SqlDataReader class to bind data to a control:
Visual Basic .NET
Dim cnn As SqlConnection = New SqlConnection("server=(local);" & _
"database=pubs;Integrated Security=SSPI")
Dim cmd As SqlCommand = New SqlCommand("select * from authors", cnn)
cnn.Open()
MyRepeater.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection)
MyRepeater.DataBind()
Visual C# .NET
SqlConnection cnn = new SqlConnection("server=(local);
database=pubs;Integrated Security=SSPI");
SqlCommand cmd = new SqlCommand("select * from authors", cnn);
cnn.Open();
MyRepeater.DataSource = cmd.ExecuteReader(CommandBehavior.CloseConnection);
MyRepeater.DataBind();
Visual J# .NET
SqlConnection cnn = new SqlConnection("server=(local);
database=pubs;Integrated Security=SSPI");
SqlCommand cmd = new SqlCommand("select * from authors", cnn);
cnn.Open();
MyRepeater.set_DataSource(cmd.ExecuteReader(CommandBehavior.CloseConnection));
MyRepeater.DataBind();
For more information about the
SqlDataReader class and data access with ASP.NET, see the following topics in
the .NET Framework SDK documentation:
Binding in list control templates
You can use templates in the list controls to bind and to
customize individual records of a data source. This section includes three
methods to do this.
DataBinder.Eval method
When the data source works with data that is returned from a
database, the data source may contain numerous pieces of information. You can
use the generic
DataBinder.Eval method to return data. In the following code sample, the "au_id"
field is returned from the data source of the container object:
<%# DataBinder.Eval(Container.DataItem,"au_id") %>
For more information about the
DataBinder.Eval method, see the following .NET Framework SDK documentation:
Explicit casting
If you need more control, use explicit casting. An explicit
conversion uses a type conversion keyword. These keywords act as functions, but
the compiler generates the code inline. Therefore, execution is slightly faster
than with a function call. The following code samples use explicit casting:
Visual Basic .NET
' DataTable as the DataSource
<%# CType(Container.DataItem, System.Data.DataRowView)("au_id") %>
' DataReader as the DataSource
<%# CType(Container.DataItem, System.Data.Common.DbDataRecord)("au_id") %>
' DataReader as the DataSource
<%# CType(Container.DataItem, System.Data.Common.DbDataRecord)(0) %>
Visual C# .NET
// DataTable as the DataSource
<%# ((System.Data.DataRowView)Container.DataItem)["au_id"] %>
// DataReader as the DataSource
<%# ((System.Data.Common.DbDataRecord)Container.DataItem)["au_id"] %>
// DataReader as the DataSource
<%# ((System.Data.Common.DbDataRecord)Container.DataItem)[0] %>
Visual J# .NET
// DataTable as the DataSource
<%# ((System.Data.DataRowView)Container.DataItem)["au_id"] %>
// DataReader as the DataSource
<%# ((System.Data.Common.DbDataRecord)Container.DataItem)["au_id"] %>
// DataReader as the DataSource
<%# ((System.Data.Common.DbDataRecord)Container.DataItem)[0] %>
Note that the preceding samples use either a
DataTable, which is a subset of a
DataSet, or
DataReader as a data source.
ItemDataBound event
You can also use the
ItemDataBound event of the control to bind the data. This event occurs when an
item is data bound to the control. The following HTML code sample defines a
Repeater control with an
ItemTemplate:
<asp:repeater id=rptr runat=server>
<itemtemplate>
<asp:label id=lblAuthorID runat=server />
</itemtemplate>
</asp:repeater>
The following methods are required in your page:
Visual Basic .NET
public Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
'TODO: Retrieve data from a database,
'and bind the data to a list control.
End Sub
public Sub rptr_OnItemDataBound(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptr.ItemDataBound
Dim rec As DataRowView
rec = e.Item.DataItem
'Make sure that you have the data.
If Not IsDBNull(rec) Then
Dim l1 As Label
l1 = e.Item.FindControl("lblAuthorID")
l1.Text = rec("au_id").ToString()
End If
End Sub
Visual C# .NET
public void Page_Init(object sender, System.EventArgs e)
{
rptr.ItemDataBound += new RepeaterItemEventHandler(rptr_OnItemDataBound);
}
public void Page_Load(object sender, System.EventArgs e)
{
// TODO: Retrieve data from a database,
// and bind the data to a list control.
}
public void rptr_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
System.Data.Common.DbDataRecord rec = (System.Data.Common.DbDataRecord)
e.Item.DataItem;
if(rec!=null) //Make sure that you have the data.
{
Label l1 = (Label)e.Item.FindControl("lblAuthorID");
l1.Text = rec["au_id"].ToString();
}
}
Visual J# .NET
public void Page_Init(Object sender, System.EventArgs e)
{
rptr.add_ItemDataBound(new RepeaterItemEventHandler(rptr_OnItemDataBound));
}
private void Page_Load(Object sender, System.EventArgs e)
{
// TODO: Retrieve data from a database,
// and bind the data to a list control.
}
public void rptr_OnItemDataBound(Object sender, RepeaterItemEventArgs e)
{
System.Data.Common.DbDataRecord rec = (System.Data.Common.DbDataRecord)
e.get_Item().get_DataItem();
if (rec != null) //Make sure that you have the data.
{
Label l1 = (Label)e.get_Item().FindControl("lblAuthorID");
l1.set_Text(((rec.get_Item("au_id")).ToString()));
}
}