如何在ItemDataBound期间访问正在数据绑定的项?

13

在 asp:repeater 的 ItemDataBound 事件期间,我希望能访问正在数据绑定的项。

我尝试了以下方法(这是一个 stackoverflow 问题中未被接受的答案):

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Object dataItem = e.Item.DataItem;
    ...
}

但是e.Item.DataItem为空。

在事件ItemDataBound被调用时,我如何访问正在绑定数据的项。我假设事件ItemDataBound发生在绑定数据项时。

我想要访问这个对象,以便我可以采取措施来控制它的显示方式,此外该对象可能有其他有用的属性,让我可以丰富它的显示方式。

答案

Tool 给出了正确的答案。答案是e.Item.Data仅在e.Item.ItemType为(Item,AlternatingItem)时有效。其他时间它无效。在我的情况下,我收到了标题(或页脚)行中的ItemDataBound事件,在那里没有DataItem:

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   // if the data bound item is an item or alternating item (not the header etc)
   if (e.Item.ItemType != ListItemType.Item && 
         e.Item.ItemType != ListItemType.AlternatingItem)
   {
      return;
   }

   Object dataItem = e.Item.DataItem;
   ...
}

我认为事件在绑定数据之后触发。我记得以前我会在PreRender事件中访问数据。不过需要检查一些旧代码。 - Damien
我个人更喜欢按照答案的方式来做,因为这样比在像ItemDataBound这样的void方法中随机返回更容易理解。这只是我的个人观点。 - Mitchel Sellers
6个回答

17

我一开始就得猜测你需要这个:

if (e.Item.ItemType == ListItemType.Item ||
    e.Item.ItemType == ListItemType.AlternatingItem)
{
    //Put stuff here
}

毕竟,该项本身可以代表页眉或页脚行。


是的,这在中继器上是必需的。 - Mitchel Sellers
是的,我实际上已经编辑了几次,因为在测试中没有进行检查它也没有失败,所以对于中继器我有点缺乏经验,让我认为它们不需要。当然,我实际上并没有添加标题来进行测试...太聪明了。 - Programmin Tool

12

我只是想补充一下,我是通过以下方式实现的:

protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
      //determine if the row type is an Item
      if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
      {
        DataRowView row = (DataRowView)e.Item.DataItem;
        if (row["RowName"].ToString() == "value")
        {
          //INSERT CODE HERE
        }
      }
    }

3
这对我更有帮助,因为它提供了一个根据名称检索特定列信息的示例。 - Jacob Morris

3

对于中继器

if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType...

可以修改为:

if (e.Item.DataItem != null) ...

1
使用动态
 dynamic item = e.Item.DataItem;
 string style = item.Style;

0

对于一个具有自定义模板绑定的重复器,你可以使用以下模板。我用它来创建了一个表格,将每个数据项拆分为两行以供打印查看。

Repeater1.HeaderTemplate = new PrintTemplate(ListItemType.Header);
Repeater1.ItemTemplate = new PrintTemplate(ListItemType.Item);
Repeater1.AlternatingItemTemplate = new  PrintTemplate(ListItemType.AlternatingItem);
Repeater1.FooterTemplate = new PrintTemplate(ListItemType.Footer);

 public class PrintTemplate : ITemplate
{
    ListItemType templateType;

  public PrintTemplate(ListItemType type)
  {
     templateType = type;

  }
  public void InstantiateIn(System.Web.UI.Control container)
  {       
     Literal lc = new Literal();

     switch(templateType)
     {
        case ListItemType.Header:
           lc.Text = "<TABLE>";
           container.Controls.Add(lc);
           break;
        case ListItemType.Item:
        case ListItemType.AlternatingItem:
           //lc.Text = "<TR><TD>";
           lc.DataBinding += new EventHandler(TemplateControl_DataBinding);
           container.Controls.Add(lc);
           break;
        case ListItemType.Footer:
           lc.Text = "</TABLE>";
           container.Controls.Add(lc);
           break;
     }
  }

    private void TemplateControl_DataBinding(object sender,
    System.EventArgs e)
          {

              Literal lc;
              lc = (Literal)sender;
              RepeaterItem container = (RepeaterItem)lc.NamingContainer;
              ListItemType itmType = container.ItemType;

              //construct the repeater row using a custom function that switches on item type; HEADER vs ITEM vs ALTERNATINGITEM
              lc.Text += GetPopulatedRepeaterRow(dataInterface, container.DataItem, container.ItemType); 
              ...

0
如果你正在处理asp:ListView,你可以像这样做:
    protected void myLV_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType != ListViewItemType.DataItem)
        return;

    object dataItem = ((ListViewDataItem)e.Item).DataItem;

}

这个问题的标题并没有提到asp:repeater..所以我想发布一个asp:listview的代码可能会有帮助


尽管标题没有,但问题的第一行确实有;不过StackOverflow感谢您提供额外有用的材料。 - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接