65.9K
CodeProject is changing. Read more.
Home

Databind Expression in ListView LayoutTemplate

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (4 votes)

Oct 10, 2009

CPOL

1 min read

viewsIcon

45082

downloadIcon

449

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