Click here to Skip to main content
Email Password   helpLost your password?

Table of Contents

Introduction

Questions regarding databinding, in one form or another, are probably the most asked in the ASP.NET newsgroups. It's clear everyone loves the idea of databinding but that more advanced functionality, such as event handling, conditional formatting and fine-tuning, aren't straightforward. The goal of this tutorial is to shed light on some of the more common and frequently asked questions about the capabilities of databinding.

The Sample Program

Throughout this tutorial, we'll use two separate data sources. The first will be your every-day DataSet, the other will be a strongly-typed custom collection containing strongly-typed objects.

Our DataSet will contain two tables, Customers and Orders:

Customer Structure Order Structure
Name Type Description Name Type Description
CustomerId1 Int32 Unique customer identifier OrderId Int32 Unique order identifier
Name String Name of the customer CustomerId1 Int32 Identifier of the customer who placed the order
Zip String Customer's primary ZIP or Portal code Ordered DateTime Date the order was placed on
Enabled Boolean Whether the customer is currently active/enabled Amount Decimal Dollar value of the order

1A DataRelation exists between the Customer.CustomerId and Order.CustomerId columns.

Our business entities will consist of an Owner and a Pet class:

Owner Structure Pets Structure
Name Type Description Name Type Description
OwnerId Int32 Unique owner identifier PetId Int32 Unique pet identifier
YearOfBirth Int32 The year the owner was born in Name String Name of the pet
FirstName String Owner's first name IsNeutured Boolean Whether or not the pet is neutered
LastName String Owner's last name Type PetType Indicates the type of pet (Dog, Cat, Fish, Bird, Rodent, Other)
Pets PetCollection Collection of pets the owner has

Understanding DataItem

You've undoubtedly made frequent use of the DataItem property, namely when using the DataBinding syntax, to output a value:

   1:  <%# DataBinder.Eval(Container.DataItem, "customerId") %>

It's important to understand that DataItem is actually an object, and that when you use the DataBinder.Eval function, it basically needs to figure out what type of object it is and how to get "customerId" from it. That's because your data source can be different things, such as a DataSet or DataView, an ArrayList or HashTable, a custom collection, and more. Binding happens on a row-by-row basis, and DataItem actually represents the current row being bound. For a DataSet, DataTable, or DataView, DataItem is actually an instance of DataRowView. (You might think that the DataItem for a DataSet or DataTable would be an instance of DataRow, but when you bind either of these, the DefaultView is actually used, therefore DataItem will always be a DataRowView.) When you are binding to a collection, DataItem is an instance of the item within the collection. We can observe this more clearly with the following code:

   1:  <%@ Import namespace="System.Data" %>

   2:  <%@ Import namespace="BindingSample" %>
   3:  <asp:Repeater id="dataSetRepeater" Runat="server">
   4:   <ItemTemplate>
   5:    <%# ((DataRowView)Container.DataItem)["customerId"] %> -  
   6:    <%# ((DataRowView)Container.DataItem)["Name"] %> <br />

   7:   </ItemTemplate>   
   8:   <AlternatingItemTemplate>
   9:    <%# DataBinder.Eval(Container.DataItem, "customerId") %> -  
  10:    <%# DataBinder.Eval(Container.DataItem, "Name") %> <br />
  11:   </AlternatingItemTemplate>                    
  12:  </asp:Repeater>

  13:  
  14:  <br><br>
  15:  
  16:  <asp:Repeater id="collectionRepeater" Runat="server">
  17:   <ItemTemplate>
  18:    <%# ((Owner)Container.DataItem).OwnerId %> -  
  19:    <%# ((Owner)Container.DataItem).FirstName %> <br />

  20:   </ItemTemplate>    
  21:   <AlternatingItemTemplate>
  22:    <%# DataBinder.Eval(Container.DataItem, "OwnerId") %> - 
  23:    <%# DataBinder.Eval(Container.DataItem, "FirstName") %> <br />
  24:   </AlternatingItemTemplate>        
  25:  </asp:Repeater>

In the first Repeater, we are binding to a DataSet, the ItemTemplate shows how to access values by casting DataItem to a DataRowView [5, 6], the AlternateItemTemplate will output the same information but through DataBinder.Eval [9, 10].

In the second Repeater, we bind to a custom collection. Again, the ItemTemplate shows how to cast DataItem to the right type and access the fields directly [18, 19] while the AlternateItemTemplate shows how the same is accomplished with DataBinder.Eval [22, 23].

In both cases, the ItemTemplate and AlternateItemTemplate will output the exact same information. The only difference is how the information is retrieved. DataBinder.Eval is far less performing, but has the benefit of being ignorant of the underlying structure, making it both quicker to develop and more likely to resist future changes. The goal here isn't to discuss the merits of these approaches, but simply show what DataItem truly is in order to build a proper foundation of understanding.

Formatting

Inline

While binding, it's possible to do simple formatting directly in the databinding expression or by calling functions which reside in code-behind.

   1:  <asp:Repeater id="dataSetRepeater" Runat="server">
   2:   <ItemTemplate>
   3:    <%# DataBinder.Eval(Container.DataItem, "OrderId")%> -  
   4:    <%# FormatDate(DataBinder.Eval(Container.DataItem, "Ordered"))%> -
   5:    <%# FormatMoney(DataBinder.Eval(Container.DataItem, 
                                              "Amount"))%> <br />

   6:   </ItemTemplate>
   7:  </asp:Repeater>
   8:  
   9:  <br ><br >
  10:  
  11:  <asp:Repeater id="collectionRepeater" Runat="server">  
  12:   <ItemTemplate>

  13:    <%# DataBinder.Eval(Container.DataItem, "OwnerId") %> - 
  14:    <asp:literal ID="see" Runat="server" 
  15:       Visible='<%# (int)DataBinder.Eval(Container.DataItem, 
                                            "Pets.Count") > 0 %>'>
  16:       see pets
  17:    </asp:Literal>
  18:    <asp:literal ID="nopets" Runat="server" 
  19:       Visible='<%# (int)DataBinder.Eval(Container.DataItem, 
                                            "Pets.Count") == 0 %>'>

  20:       no pets
  21:    </asp:Literal>
  22:    <br />
  23:   </ItemTemplate>
  24:  </asp:Repeater>

The second Repeater makes use of directly embedded expressions to toggle the visibility of certain controls [15, 19]. The first Repeater, which is bound to all Orders, makes use of two functions: FormatDate [4] and FormatMoney [5]. These methods could look something like:

1:  protected string FormatDate(object date) {
   2:   if (date == DBNull.Value){
   3:    return "n/a";
   4:   }
   5:   try{
   6:    return ((DateTime)date).ToShortDateString();
   7:   }catch{
   8:    return "n/a";
   9:   }
  10:  }
  11:  protected string FormatMoney(object amount) {
  12:   if (amount == DBNull.Value){
  13:    return String.Format("{0:C}", 0);
  14:   }
  15:   return String.Format("{0:C}", amount);
  16:  }

OnItemDataBound

While the above method is suitable for quick and simple problems, it lacks in elegance and capacity. Indeed, the 2nd example shows a serious lack of grace, and dangerously blends presentation logic with UI. Avoiding burdening your presentation layer with any code is a practice worth eternal vigilance. To help accomplish this, the Repeater, DataList and DataGrid all expose a very powerful and useful event: OnItemDataBound.

OnItemDataBound is fired for each row being bound to your datasource (in addition to when other templates are bound (header, footer, pager, ..)). It not only exposes the DataItem being used in binding, but also the complete template. OnItemDataBound starts to fire as soon as the DataBind() method is called on the Repeater/DataList/DataGrid.

Using OnItemDataBound lets us exercise fine control over exactly what happens during binding in a clean and robust framework. For example, reworking the 2nd Repeater from above, we get:

   1:  <asp:Repeater OnItemDataBound="itemDataBoundRepeater_ItemDataBound" 
               id="itemDataBoundRepeater" Runat="server">  
   2:   <ItemTemplate>
   3:    <%# DataBinder.Eval(Container.DataItem, "OwnerId") %> - 
   4:    <asp:Literal ID="see" Runat="server" /> <br />

   5:   </ItemTemplate>
   6:  </asp:Repeater>

Notice that our previously code-cluttered ItemTemplate is now considerably cleaner - this is because we've pushed the logic to the itemDataBoundRepeater_ItemDataBound function in code-behind:

   1:  protected void itemDataBoundRepeater_ItemDataBound(object source, 
                                        RepeaterItemEventArgs e) {
   2:   if (e.Item.ItemType == ListItemType.AlternatingItem || 
                               e.Item.ItemType == ListItemType.Item){
   3:    Literal lit = (Literal)e.Item.FindControl("see");
   4:    if (lit != null){
   5:     Owner owner = (Owner)e.Item.DataItem;
   6:     if (owner.Pets.Count == 0){
   7:      lit.Text = "no pets";
   8:     }else{
   9:      lit.Text = "see pets";
  10:     }
  11:    }
  12:   }
  13:  }

Since we are dealing with Repeaters, e.Item returns a reference to the current RepeaterItem. If this was a DataList, it would return a reference to a DataListItem, or a DataGridItem if it were a DataGrid. For the most part however, all three provide the same capabilities. The first thing to do is check the ItemType and make sure we are currently dealing with an AlternateItem or an Item [2]. Next, get a reference to our Literal [3], this is an extremely powerful capability which allows us to really keep our UI clean. As we saw in a previous section, we can cast DataItem directly to the individual item being bound (in this case Owner, but again, if we bind to a DataSet, it would be a DataRowView) [5]. Finally, all the pieces are in place to apply our presentation logic [6-10].

An alternative to using e.Item.FindControl() is to refer to the controls by position via e.Item.Controls[INDEX]. While this may be considerably faster, it really makes the UI inflexible to basic changes (else you face constantly changing the code). Additionally, white spaces and newlines are actually controls. So in the above code, you'd get:

   1:  e.Item.Controls[0] //"\r\n            1 - \r\n            "

   2:  e.Item.Controls[1] //is the actual "see" literal

Which is both an unexpected behavior and one very hard to cleanly deal with.

When it comes to OnItemDataBound, the sky is the limit. Here, we've only shown a basic example of what can be done, and though we will see other, more complex examples, we won't cover every possibility.

OnItemCreated

Another useful event exposed by these controls is OnItemCreated. The key difference between the two is that OnItemDataBound only fires when the control is bound - that is, when you are posting back and the control is recreated from the viewstate, OnItemDataBound doesn't fire. OnItemCreated, on the other hand, fires when a control is bound as well as when the control is recreated from the viewstate. The following example shows this subtle difference:

   1:  <asp:Repeater OnItemCreated="repeater_ItemCreated" 
                  OnItemDataBound="repeater_ItemDataBound" 
                  id="repeater" Runat="server">  
   2:   <ItemTemplate>

   3:    <asp:Literal EnableViewState="False" ID="event" Runat="server" /> <br />
   4:   </ItemTemplate>
   5:  </asp:Repeater>
   6:  
   7:  <asp:Button ID="btn" Runat="server" Text="Click Me!" />

Here, we have a Repeater with both the OnItemCreated and OnItemDataBound events hooked [1]. Additionally, we have a single Literal whose viewstate is disabled (if it was enabled, we couldn't see the difference) [3]. And, we have a button that'll do nothing but postback [7]. Our code-behind looks like:

   1:  private void Page_Load(object sender, EventArgs e) {
   2:   if (!Page.IsPostBack){
   3:    repeater.DataSource = CustomerUtility.GetAllOrders();
   4:    repeater.DataBind();
   5:   }
   6:  }
   7:  protected void repeater_ItemDataBound(object source, 
                                     RepeaterItemEventArgs e) {
   8:   if (e.Item.ItemType == ListItemType.AlternatingItem 
                            || e.Item.ItemType == ListItemType.Item){
   9:    Literal lit = (Literal)e.Item.FindControl("event");
  10:    if (lit != null){
  11:     lit.Text += " - ItemDataBound";
  12:    }
  13:   }
  14:  }
  15:  protected void repeater_ItemCreated(object source, 
                                     RepeaterItemEventArgs e) {
  16:   if (e.Item.ItemType == ListItemType.AlternatingItem || 
                               e.Item.ItemType == ListItemType.Item){
  17:    Literal lit = (Literal)e.Item.FindControl("event");
  18:    if (lit != null){
  19:     lit.Text += "ItemCreated";
  20:    }
  21:   }
  22:  }

When the page is first loaded, Page.IsPostBack returns false [2] and our Repeater is bound to all orders [3, 4]. Calling DataBind() causes the ItemCreated event to fire for the first row, followed by the ItemDataBound event - in our example, each will fire, one after the other, 11 times (since there are 11 orders). As we can see, ItemCreated and ItemDataBound merely take the Literal and append the texts "ItemCreated" and "ItemDataBound" respectively. The difference happens when our button is clicked. This causes Page_Load to fire, but this time Page.IsPostBack evaluates to true, thus skipping the binding [3, 4]. Only when the page enters its Begin PreRender stage will the ItemCreated event fire (again, once for each row), but this time it won't be followed by the ItemDataBound.

The really important thing to keep in mind is that when ItemCreated fires because of databinding, e.Item.DataItem will be what you expect - a reference to the individual row being bound. However, when ItemCreated is fired from being re-created from the viewstate, e.Item.DataItem will be NULL. If you think about it, this makes sense. The entire data source isn't stored in the viewstate, only the individual controls and their values. As such, it's impossible to have access to the individual rows of data originally used when binding. Of course, this can lead to very buggy code. For example, if we took our previous ItemDataBound example and moved it to the ItemCreated event:

   1:  protected void itemCreatedRepeater_ItemCreatedobject source, 
                         RepeaterItemEventArgs e) {
   2:   if (e.Item.ItemType == ListItemType.AlternatingItem 
                        || e.Item.ItemType == ListItemType.Item){
   3:    Literal lit = (Literal)e.Item.FindControl("see");
   4:    if (lit != null){
   5:     Owner owner = (Owner)e.Item.DataItem;
   6:     if (owner.Pets.Count == 0){
   7:      lit.Text = "no pets";
   8:     }else{
   9:      lit.Text = "see pets";
  10:     }
  11:    }
  12:   }
  13:  }

When the page first loads, the above code will work fine. But if the page is posted back, e.Item.DataItem will be null, resulting in a runtime null reference error.

Nested Binding

Another common requirement is to nest controls within each other. Both of our sample data has a one to many relationship and are therefore ideal candidates. Our Customers DataSet has a DataRelation set up between the Customer's customerId and the Order's customerId:

   1:  ds.Relations.Add(new DataRelation("CustomerOrders", 
          ds.Tables[0].Columns["CustomerId"], 
          ds.Tables[1].Columns["CustomerId"]));

And our Owners have a Pets property which is a collection of all the pets they own.

The two ways that we'll look at nesting Repeaters is via inline binding and using OnItemDataBound.

Inline

   1:  <asp:Repeater id="dataSetCasting" Runat="server">

   2:   <HeaderTemplate>
   3:    <ul>
   4:   </HeaderTemplate>
   5:   <ItemTemplate>
   6:    <li><%# ((DataRowView)Container.DataItem)["Name"]%>

   7:     <ul>
   8:     <asp:Repeater ID="orders" DataSource='<%# 
             ((DataRowView)Container.DataItem).CreateChildView("CustomerOrders")%>' 
             Runat="server">
   9:      <ItemTemplate>
  10:       <li><%# ((DataRowView)Container.DataItem)["Amount"]%></li>

  11:      </ItemTemplate>
  12:     </asp:Repeater>
  13:     </ul>
  14:    </li>
  15:   </ItemTemplate>

  16:   <FooterTemplate>
  17:    </ul>
  18:   </FooterTemplate>
  19:  </asp:Repeater>

The important part being when we set the DataSource of our inner Repeater [8]. The CreateChildView function in our DataRowView is used in conjunction with the name of our DataRelationship to return a DataView of all child records. Alternatively, using the DataBinder.Eval, we could simply use:

   1:  <asp:Repeater ID="orders" 
         DataSource='<%# DataBinder.Eval(Container.DataItem, "CutomerOrders")%>' 
         Runat="server">

Again, we use the CustomerOrders DataRelation which we created, but let the DataBinder.Eval handle everything else.

Nesting with custom collections is even easier. Since Owners have a property called Pets which is a custom collection of all the pets they own, we can simply:

   1:  <asp:Repeater id="collectionCasting" Runat="server">

   2:   <HeaderTemplate>
   3:    <ul>
   4:   </HeaderTemplate>
   5:   <ItemTemplate>
   6:    <li><%# ((Owner)Container.DataItem).FirstName%> 
   7:     <ul>

   8:     <asp:Repeater ID="pets" 
             DataSource="<%# ((Owner)Container.DataItem).Pets%>" 
             Runat="server">
   9:      <ItemTemplate>
  10:       <li><%# ((Pet)Container.DataItem).Name%></li>
  11:      </ItemTemplate>

  12:     </asp:Repeater>
  13:     </ul>
  14:    </li>
  15:   </ItemTemplate>
  16:   <FooterTemplate>

  17:    </ul>
  18:   </FooterTemplate>
  19:  </asp:Repeater>

Or using DataBinder.Eval:

   1:  <asp:Repeater ID="pets" 
          DataSource='<%# DataBinder.Eval(Container.DataItem, "Pets")%>' 
          Runat="server">

OnItemDataBound

If something is doable using inline ASPX, it's doable via onItemDataBound. Deciding which method to use often depends on which you feel is cleaner and more flexible. We'll only look at one example, since it's basically the same as the above code, except the binding logic is moved to code-behind:

   1:  <asp:Repeater OnItemDataBound="dataSetCasting_ItemDataBound" 
                           id="dataSetCasting" Runat="server">
   2:   <HeaderTemplate>
   3:      <ul>

   4:   </HeaderTemplate>
   5:   <ItemTemplate>
   6:    <li><%# ((DataRowView)Container.DataItem)["Name"]%>
   7:     <ul>

   8:     <asp:Repeater ID="orders"  Runat="server">
   9:      <ItemTemplate>
  10:       <li><%# ((DataRowView)Container.DataItem)["Amount"]%></li>
  11:      </ItemTemplate>

  12:     </asp:Repeater>
  13:     </ul>
  14:    </li>
  15:   </ItemTemplate>
  16:   <FooterTemplate>

  17:    </ul>
  18:   </FooterTemplate>
  19:  </asp:Repeater>

Notice that our inner Repeater doesn't have a DataSource property [8], however our outer Repeater does specify an OnItemDataBound function [1], let's look at it:

   1:  protected void dataSetCasting_ItemDataBound(object s, 
                            RepeaterItemEventArgs e) {
   2:   if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType 
                                       == ListItemType.AlternatingItem){
   3:    Repeater rpt = (Repeater)e.Item.FindControl("orders");
   4:    if (rpt != null){
   5:     rpt.DataSource = 
                ((DataRowView)e.Item.DataItem).CreateChildView("CustomerOrders");
   6:     rpt.DataBind();
   7:    }
   8:   }
   9:  }

Basically, the same thing is happening as we saw before, except this is happening out of the UI.

Handling Events

The last thing to discuss is how to handle events raised by controls inside your Repeater/DataList/DataGrid. Events raised from controls inside your Repeater bubble up to the Repeater and are exposed via the OnItemCommand event. LinkButtons and Buttons have a CommandArgument and CommandName property which lets the OnItemCommand handler figure out which button was clicked, for example:

   1:  <asp:Repeater OnItemCommand="eventRepeater_ItemCommand" 
                              id="eventRepeater" Runat="server">

   2:   <ItemTemplate>
   3:    <%# DataBinder.Eval(Container.DataItem, "Name")%>      
   4:    <asp:LinkButton ID="delete" 
   5:      Runat="server" 
   6:      CommandName="Delete" 
   7:      CommandArgument='<%# DataBinder.Eval(Container.DataItem, 
                                              "CustomerId") %>'>
   8:     Delete Customer
   9:    </asp:LinkButton>

  10:        -    
  11:    <asp:LinkButton ID="addOrder" 
  12:      Runat="server" 
  13:      CommandName="Add" 
  14:      CommandArgument='<%# DataBinder.Eval(Container.DataItem, 
                                              "CustomerId") %>'>
  15:     Add Order
  16:    </asp:LinkButton>
  17:    <br />

  18:   </ItemTemplate>
  19:  </asp:Repeater>

In the above code, two LinkButtons can raise events, either deleting the customer [4-9] or adding an order [11-16]. Also note that the ItemCommand is hooked up [1]:

   1:  protected void eventRepeater_ItemCommand(object s, 

                                    RepeaterCommandEventArgs e) {
   2:   int customerId = Convert.ToInt32(e.CommandArgument);
   3:   switch (e.CommandName.ToUpper()){
   4:    case "DELETE":
   5:     CustomerUtility.DeleteCustomer(customerId);
   6:     BindEventRepeater(false);
   7:     break;
   8:    case "Add":
   9:     //doesn't actually do antyhing right now.

  10:     break;
  11:   }
  12:  }

Depending on what the commandName is [3], we know different actions were requested. It's important to note that if you change the underlying data source (like deleting a row) and want that to be visible to the user, you need to rebind your Repeater/DataList/DataGrid. Also note that if you are caching your data, like I am here, you'll need to invalidate the cache so that the new data source (with the delete/added/updated rows) is used.

Download

This sample web application simply contains a number of pages which do various things with Repeaters. It should provide a playground for trying different things and simply messing around with data binding:

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
Rantgrazielle
grazielle
4:52 16 Dec '09  
Amo quem me ama

Oie povo quem tah ai.?
GeneralStill Relevant
DiverJohn
4:40 19 Aug '09  
Hey Karl,

Just a qik message from a junior/int developer learning the craft...
This is a fantasic , clear article, It should be 'required reading' for all newbies.

And its still relevant in 09!!   I have just missed out on a full time job because the CMS application I was working with used HEAPS of this and my skills weren't sharp.. I wish I had found this a month ago !!!
Generalerror
jay1234567890
5:51 11 Dec '08  
hello,
i m getting 'Specified cast is not valid' error when i try to compare
Visible='<%# (int)DataBinder.Eval(Container.DataItem,"SentBatch") < 0


the only error can be int as sentbatch is of type bigint in database.. if yes can anyone help me what to specify instead of int?

thanks in advance.
GeneralRe: error
jay1234567890
6:05 11 Dec '08  
i have tried with other integer field, it work fine. so the problem is bigint..
GeneralRe: error
jay1234567890
6:59 11 Dec '08  
its long in case of bigint in c#

cheers
QuestionReport Generation with ASP.NET Page
Sudhir Kr. Singh
4:16 16 Jul '08  
I want to retrive data from SQL and diplay it on ASP.NET page as below given format.

                                                                  col4                                                         col5                        Total
                                                         col6            col7            col8               col9      col10   col11
SN   col1      col2   col3      col12   col13   col14   col15   col16   col17

Does any one know please help.
thanx

Sudhir
QuestionData binding data to Repeater
mnalammwb
5:38 13 Mar '08  
hello all,

I am using A Repeater inside it i have label. I am fill the text of label as
protected void rptFoprcast_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemIndex > -1)
{
Label lblTargetPrice = new Label();
lblTargetPrice=(Label)e.Item.FindControl("lblTargetpric");
lblTargetPrice.Text=FillTargetPrice(str1).ToString();
}
}

protected double FillTargetPrice(string str)
{

double n = 0.0;
conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
cmd = new SqlCommand(str, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
try
{
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
n = Convert.ToDouble(dr.GetValue(0));
}
conn.Close();
return n;
}
catch (Exception ex)
{
string msg;
msg = ex.Message;
return n;
}
}

But it is biding the targetPrice find last time to the label time how many time finds. Means suppose result found are 50,30,80 and 120 then label apears 4 times and every times 120 dispays.
please help me display label with 4 values.

thanks
noor alam
AnswerRe: Data binding data to Repeater
azthief
22:26 4 Oct '09  
I think all Labels has a same name (lblTargetPrice)
That makes all of label shows 120 when you run it.....
Generalcool~
z19z86l
17:52 28 Jan '08  
cool~
GeneralExcellent!!
rujuc#
22:13 17 Jan '08  
Very nice and helpful!!
QuestionDatalist Within Datalist [modified]
mshariq
0:51 31 Mar '07  
Fellow, i m using v2 2003 with sql server 2000's Northwind database. In my prog, i m using 2 datalists, named countrylist and emplist & i want the output like this
USA. UK.
Nancy Davolio Steven Buchanan
Andrew Fuller Michael Suyama
Janet Leverling Robert King
Margaret Peacock Anne Dodsworth
Laura Callahan
Following r the queries which i m using
select distinct country from employees order by country desc
select FirstName + ' ' + LastName as Name from Employees order by country desc, employeeid
In page load i m filling the countrylist with the command
select distinct country from employees order by country desc & kept the RepeatDirection="Horizontal"
In itemtemplate of CountryList with a bold paragraph sign <%#DataBinder.eval(Container.DataItem, "Country") %>. in the next para i wrote asp:DataList id="EmpList" RepeatColumns="2" RepeatDirection="Vertical". itemtemplate of EmpList <%#DataBinder.eval(Container.DataItem, "Name") %>. Then i closed Emplist followed by countrylist. in ItemDataBoundof country list i wrote the following code
dim EmpList As DataList = CType(e.Item.FindControl("CountryList"), DataList)
Then filled the dataset with the command
"select FirstName + ' ' + LastName as Name from Employees order by country desc, employeeid" & then bind that datasource with emplist
EmpList.DataSource = ds.Tables(0)
EmpList.DataBind()
When i run this prog it gives the following error thrice, Object reference not set to an instance of an object. Plz sort out this prob asap bcoz it's urgent for me. If u give me ur email add, i'll send u the whole prog
GeneralHuh?
Neophyte30
23:29 11 Sep '06  
'System.Web.UI.Control' does not contain a definition for 'DataItem'

I don't get it - how does the data binding expression know what the datasource is? How are they related?

GeneralRe: Huh?
Karl Seguin
14:21 12 Sep '06  
Neophyte:
Not sure where/how you're getting this error. The DataBinding expression uses reflection and polymorphism to determine the underlying source.
GeneralGreat my friend (helpful) [modified]
akram_83
6:09 16 Aug '06  




-- modified at 11:09 Wednesday 16th August, 2006
GeneralLinkbutton within a nested repeater
rudey
9:27 12 Jul '06  
I have a linkbutton within a nested repeater. I do I trap the events raised from that linkbutton? the HTML is as follows:

<asp:Repeater ID="rptr_category" runat="server" OnItemCommand="rptr_category_ItemCommand">
<HeaderTemplate>

    </HeaderTemplate>



  • <asp:label runat="server" ID="lbl_categoryName" Text='<%#Container.DataItem("CategoryName")%>'>
    <asp:Label runat="server" ID="lbl_categoryID" Visible = "false" Text= '<%# container.dataitem("ID") %>'>


  • <asp:Repeater ID="rptr_subCategory" runat="server">
    <HeaderTemplate>

      </HeaderTemplate>



    • <asp:LinkButton runat="server" ID="lnk_subCategoryName" Text='<%#container.dataitem("CategoryName") %>' CommandArgument='<%#container.dataItem("ID")%>'>



















RQ
GeneralRe: Linkbutton within a nested repeater - sorry here's the html
rudey
9:28 12 Jul '06  
<asp:Repeater ID="rptr_category" runat="server" OnItemCommand="rptr_category_ItemCommand">
            <HeaderTemplate>
                  <ul>
            </HeaderTemplate>
           
            <ItemTemplate>
                  <li>
                        <asp:label runat="server" ID="lbl_categoryName"   Text='<%#Container.DataItem("CategoryName")%>'></asp:label>
                        <asp:Label runat="server" ID="lbl_categoryID"   Visible = "false" Text= '<%# container.dataitem("ID") %>'></asp:Label>
                  </li>
           
               <li> <asp:Repeater ID="rptr_subCategory" runat="server">
                        <HeaderTemplate>
                              <ul>
                     </HeaderTemplate>
                    
                     <ItemTemplate>
                     <li>
                           <asp:LinkButton   runat="server" ID="lnk_subCategoryName" Text='<%#container.dataitem("CategoryName") %>'   CommandArgument='<%#container.dataItem("ID")%>'></asp:LinkButton>
                                             </li>
           
           
                     </ItemTemplate>
           
           
                     <FooterTemplate>
                        </ul>
                        </FooterTemplate>
                  </asp:Repeater></li>
                       
            </ItemTemplate>
            <FooterTemplate>
            </ul>
            </FooterTemplate>
      </asp:Repeater>

RQ
GeneralGreat article
kcobain81
9:45 18 May '06  
Thanks for your article, it solved my problems with nested databinding.
GeneralVery Helpful
chris lasater
12:53 14 Mar '06  
Nicely written and good examples.

Chris Lasater
http://www.geocities.com/lasaterconsult
GeneralNice Article !!
Tittle Joseph
20:45 6 Mar '06  
You cleared my many doubts on data binding. Thanks for nice article.
5 gloves from me.
GeneralNested DataLists event problem
dejawoo
1:18 21 Feb '06  


I have a nested datalists. Parent datalists bounds to datasource only once if it is !IsPostBack.

On parentdatalists ItemDataBound event I am finding the childdatalist and binding it to datasource. Also I setting its ItemDataBound and ItemCommand eventshandlers.

in ChildDatalist_ItemDatabound event I m finding the LinkButton within it. assinging its command argument for this LinkButton.

ViewState is enabled for both datalists.

What is wrong, when I click the LinkButton and it does not bubbles, I mean nothing happen.

Please could you help me with this. Thanx.


GeneralRe: Nested DataLists event problem
Karl Seguin
2:20 22 Feb '06  
Events need to be set during postback. Viewstate doesn't keep that information. You'll need to hook into the ItemCreated (also happens during postback, unlike ItemDataBound), find the control and rehook the event.

Karl
GeneralRe: Nested DataLists event problem
dejawoo
3:13 22 Feb '06  
hi Karl,

thank you for reply. Yeah I realized that it viewstate does not keeps the event handlers reference. I mean it should be signed on each request. I realized it from InitializeComponent function. Yeah I have done as you said I m signing the handlers in itemcreated event for each time.
Thanks. Appreciated.

DejawooSmile
General1:1 Relationship , with Strongly Typed DataSet
sholliday
18:01 11 Dec '05  




Notice I get the 1st item of the array using "[0]".
This gets cast as a MyStrongDS.EmpRow. (Again, this is a strongly type dataset).

Saying it another way, I cast the current item to a EmpRow, I get the children of this row (using the relationship name), and since I know there is only 1 parent Dept, I use "[0]" to get this first (and only) item, and then I say "show me the DeptName".

..

Sniff
I was struggling with this, and your post gave me the clues I needed.
(Thanks).

Here is the syntax for:

A child with exactly 1 parent.

Think of an employee, who has a (single) parent department. My dataset will have 2 tables.
Emp and Dept.
there is an Emp.DeptID which is the foreign key.
In the dataset, the relationship name is "The_Relationship_Name_Emp_Dept"

Here is some code.


Cell:
<%# DataBinder.Eval(Container.DataItem, "EmpName")%>

DeptName:
<%# DataBinder.Eval(((MyStrongDS.EmpRow)Container.DataItem)
.GetChildRows("The_Relationship_Name_Emp_Dept")[0], "DeptName")%>


QuestionMultilevel nesting.
Anonymous
6:14 27 Sep '05  
Anyone knows how to do a third level of nesting in dararepeater?

Thanks
GeneralExcellent article for intermed developers
ohyeahbaby
8:14 10 Jun '05  
Karl,
Thanks for the clear treatment of databinding and the control and object elements that go into referencing data coming in from datasets etc. For us stand-alone developers who have to rely on other developers' code (cut n paste!) in order to make a deployment deadline, your article is a great opportunity for us to stop and actually consider how and why "our" pasted code works. This allows us to move on from being just adaptors and re-arrangers of code to developing original applications on our own.

Thanks and I look forward to any more contributions you make to the ever excellent Code Project!

// Shannon Smile


Last Updated 29 Oct 2004 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2010