Search code examples
c#asp.netlistviewlistviewitemasp.net-4.5

Dynamically insert non-database value in ItemTemplate for ListView


I have a listview populated from the database. I also have a dynamically calculated value (users inputted postcode relative distance to all database postcode)

I tried adding a label which I can successfully access in the ItemTemplate for the ListView through the ItemDataBound event:

protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
  if (e.Item.ItemType == ListViewItemType.DataItem)
  {
    if (CategoryList.SelectedIndex == 5)
    {
      var lb = e.Item.FindControl("lbPostcodeDistance") as Label;
      if (!string.IsNullOrEmpty(tbPostcode.Text))
      {
        lb.Text = "Distance from: " + tbPostcode.Text;
        lb.Visible = true;            
      }
    }
  }
}

Above works fine, however, I need to dynamically add an actual value to lb.Text.

The value is calculated in my public IEnumerable<...> ListView1_GetData(), here is a snippet of code:

var inRangeWalks = new List<InRangeWalks>();            
foreach (var walk in grabAllWalks)
{
  double dis = //calculation here
  if (dis <= radius)
  {
    inRangeWalks.Add(new InRangeWalks(dis, walk));
  }
}

inRangeWalks.Sort((x, y) => x.DistanceFromPostcode.CompareTo(y.DistanceFromPostcode));
}
return inRangeWalks.Select(x => x.Walk); //ListView only wants walks, thus returned ordered Walks. 

The code above works perfectly, but I need to add the dis value to each item in the ItemTemplate. I've been trying to do it using the ItemDataBound event but I am not sure if this is correct, or even possible.

Here is my ItemTemplate:

<ItemTemplate>
    <div class="row">
        ...
        <h6><b>Location:</b> <%# Item.Location%>, <%# Item.Postcode%></h6> 
        <asp:Label ID="lbPostcodeDistance" runat="server" Text="Label" Visible="false"></asp:Label>
    </div>
</ItemTemplate>

How else could I show an additional dynamically calculated value, exactly where the label is in the ItemTemplate?


Solution

  • Ok I actually ended up using Rahul's advice in the comments, and made my ListView use my custom data source.

    Was a little bit of a pain to get it up and running but it's now working great!

    If someone wants to implement their own data structure, just remember on the ASPX page change the ItemType to the new structure i.e. ItemType="MyProject.Folder.ClassName". And then you can access the property with model binding like: text=<%# Item.MyObject.Property %>