Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Databind Expression in ListView LayoutTemplate

0.00/5 (No votes)
9 Oct 2009 1  
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). 

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. 

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. 

 <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 has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here