Binding data to a Repeater using Lazy Loading (ASP.NET C#)
Lazy loading is a method of only loading data as and when you need it. Rather than loading it on page load, you can define a property that can then be bound to a WebControl.
For example, in the page is an asp:Repeater
:
<asp:Repeater ID="MyRepeater" DataSource='<%# MyData %>' runat="server"> <HeaderTemplate><ul></HeaderTemplate> <ItemTemplate><li><a href="<%# Eval("Url") %>"><%# Eval("Text") %></a> (Record ID: <%# Eval("RecordID") %>)</li></ItemTemplate> <FooterTemplate></ul></FooterTemplate> </asp:Repeater>
MyData
in the DataSource
attribute of asp:Repeater
is a property defined in the CodeBehind page:
private DataTable _MyData; public DataTable MyData { get { if (_MyData == null) { _MyData = LoadMyData(); } return _MyData; } }
LoadMyData
gets the data you want to show (normally it would be loaded from a database, rather than rows added in this case)
private DataTable LoadMyData() { Trace.Write("LoadMyData"); DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("RecordID", Type.GetType("System.Int32"))); dt.Columns.Add(new DataColumn("Text", Type.GetType("System.String"))); dt.Columns.Add(new DataColumn("Url", Type.GetType("System.String"))); DataRow row; int index = 1; // new row row = dt.NewRow(); // populate row row["RecordID"] = index; row["Text"] = "Google"; row["Url"] = "http://www.google.co.uk"; // add row to table dt.Rows.Add(row); // increment index index++; // new row row = dt.NewRow(); // populate row row["RecordID"] = index; row["Text"] = "Yahoo"; row["Url"] = "http://www.yahoo.co.uk"; // add row to table dt.Rows.Add(row); return dt; }
The Trace.Write
is there to show that the data isn't loaded if it is not bound to a WebControl in the page. This can be tested by turning on tracing (adding Trace="True"
to <%@ Page
) and removing DataSource='<%# MyData %>'
from the Repeater.
You would then bind the page on load:
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { DataBind(); } }
LazyLoadRepeater.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="LazyLoadRepeater.aspx.cs" Inherits="LazyLoadRepeater" Trace="true" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Lazy Loading</title> </head> <body> <form id="form1" runat="server"> <div> <h1>Search Engines</h1> <asp:Repeater ID="MyRepeater" DataSource='<%# MyData %>' runat="server"> <HeaderTemplate><ul></HeaderTemplate> <ItemTemplate><li><a href="<%# Eval("Url") %>"><%# Eval("Text") %></a> (Record ID: <%# Eval("RecordID") %>)</li></ItemTemplate> <FooterTemplate></ul></FooterTemplate> </asp:Repeater> </div> </form> </body> </html>
LazyLoadRepeater.aspx.cs:
using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; public partial class LazyLoadRepeater : System.Web.UI.Page { private DataTable _MyData; public DataTable MyData { get { if (_MyData == null) { _MyData = LoadMyData(); } return _MyData; } } protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { DataBind(); } } private DataTable LoadMyData() { Trace.Write("LoadMyData"); DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("RecordID", Type.GetType("System.Int32"))); dt.Columns.Add(new DataColumn("Text", Type.GetType("System.String"))); dt.Columns.Add(new DataColumn("Url", Type.GetType("System.String"))); DataRow row; int index = 1; // new row row = dt.NewRow(); // populate row row["RecordID"] = index; row["Text"] = "Google"; row["Url"] = "http://www.google.co.uk"; // add row to table dt.Rows.Add(row); // increment index index++; // new row row = dt.NewRow(); // populate row row["RecordID"] = index; row["Text"] = "Yahoo"; row["Url"] = "http://www.yahoo.co.uk"; // add row to table dt.Rows.Add(row); return dt; } }
Comments