在ListView的ItemTemplate中动态插入非数据库值

本文关键字:插入 数据库 动态 ListView ItemTemplate | 更新日期: 2023-09-27 18:27:06

我有一个从数据库中填充的列表视图。我还有一个动态计算的值(用户输入的邮政编码与所有数据库邮政编码的相对距离)

我尝试通过ItemDataBound事件在ItemTemplate中为ListView添加一个可以成功访问的标签:

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;            
      }
    }
  }
}

上面的操作很好,但是,我需要动态地向lb.Text添加一个实际值。

这个值是在我的public IEnumerable<...> ListView1_GetData()中计算的,这里有一段代码:

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. 

上面的代码运行得很好,但我需要将dis值添加到ItemTemplate中的每个item中。我一直在尝试使用ItemDataBound事件来执行此操作,但我不确定这是否正确,甚至不确定是否可能。

这是我的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>

否则,我如何显示额外的动态计算值,即标签在ItemTemplate中的确切位置?

在ListView的ItemTemplate中动态插入非数据库值

好的,我最终在评论中使用了Rahul的建议,并使我的ListView使用了我的自定义数据源。

启动和运行时有点痛苦,但现在效果很好!

如果有人想实现自己的数据结构,只需记住在ASPX页面上将ItemType更改为新结构,即ItemType="MyProject.Folder.ClassName"。然后您可以使用模型绑定访问属性,如:text=<%# Item.MyObject.Property %>