Click here to Skip to main content
15,885,216 members
Articles / Web Development / ASP.NET

Databind Expression in ListView LayoutTemplate

Rate me:
Please Sign up or sign in to vote.
4.75/5 (4 votes)
10 Oct 2009CPOL1 min read 44.6K   449   5   5
Solution for Databind Expression error/not working in ListView LayoutTemplate

Introduction

This article pretends to show a possible solution for a common problem when asp.net developers work with ListView: databind expression (<%# %>) in the LayoutTemplate does not work.

My English is not the best so all suggestions and fixes are welcome. 

Solution  

Sometime ago I had to face this problem, I google it and found a possible solution: extend ListView class and do the databind in the CreateLayoutTemplate. In my case was not the best solution because we had a lot of code done and change asp listview tag for the new custom listview tag was simply unacceptable.

I don’t want to extend me (because my english) but basically what I did was use Adapaters. I previously worked with css adapters so I used that code like a base. After some research I found that correct adapter for ListView is DataBoundControlAdapter ( in System.Web.UI.WebControls.Adapters namespace). 

C#
public class ListViewAdapter : DataBoundControlAdapter
{}		

The next that I had to decide was where and how to do the LayoutTemplate DataBind, the first (and the unique) option that I found was LayoutCreated event. Now, I had‘where’ but left how. Checking the ListView inside handler of LayoutCreated event I found that all databind expressions were removed, also I notice that Listview only had one control (the rendered LayoutTemplate) so the solution was instance in a temporal control the LayoutTemplate and then do the databind to it, after that, remove the current rendered layoutTemplate from listview and replace it by the new databound control. 

C#
void AdaptedControl_LayoutCreated(object sender, EventArgs e)
{
    ListView lv = AdaptedControl;
    
    Control template = new Control();
    lv.LayoutTemplate.InstantiateIn(template);
    template.DataBind(); // resolve the problem
    // remove current layout (without databind expressions)
    lv.Controls.RemoveAt(0);
    //add again the layout but with databound content
    lv.Controls.Add(template);
} 

The last step was add the Broswer file to project and the custom adapter for the listview. 

ASP.NET
<adapter controlType="System.Web.UI.WebControls.ListView" adapterType="Adapters.ListViewAdapter" />

And that’s all. Now you can use databind expressions (<%# %>) inside LayoutTemplate (obviously no data from datasource).  

History

Creation: 10/10/2009 

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Colombia Colombia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionExacto!! Pin
rcanqui28-Mar-12 5:03
rcanqui28-Mar-12 5:03 
QuestionWhy you need the adapter? Pin
Davidpw23-Oct-10 3:59
Davidpw23-Oct-10 3:59 
GeneralPerfect! Pin
MR_SAM_PIPER12-May-10 16:39
MR_SAM_PIPER12-May-10 16:39 
Exactly the solution I needed - very elegant. Do you know if this is fixed in ListView for ASP.NET 4.0?

Thanks!
GeneralRe: Perfect! Pin
dolcalmi14-May-10 10:03
dolcalmi14-May-10 10:03 
GeneralRe: Perfect! [modified] Pin
Martin Radu28-Jan-11 12:48
Martin Radu28-Jan-11 12:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.