13

我想在 asp:repeater 的 ItemDataBound 事件期间获取正在数据绑定的项目。

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

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

e.Item.DataItem为空。

如何在名为 ItemDataBound 的事件期间访问正在绑定数据的项目。我假设 ItemDataBound 事件发生在项目被数据绑定时。

我想了解对象,以便我可以采取措施控制它的显示方式,此外,该对象可能具有其他有用的属性,可以让我丰富它的显示方式。

回答

工具有正确的答案。答案是e.Item.Data只有在e.Item.ItemType(Item, AlternatingItem) 时才有效。其他时候它是无效的。就我而言,我在没有 DataItem 的页眉(或页脚)行期间收到了 ItemDataBound 事件:

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

6 回答 6

17

马上我不得不猜测你需要这个:

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

毕竟,项目本身可能代表页眉或页脚行。

于 2008-12-05T15:02:37.013 回答
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
        }
      }
    }
于 2010-09-08T17:01:40.790 回答
3

对于中继器

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

可以修改为:

if (e.Item.DataItem != null) ...
于 2009-07-25T09:16:19.507 回答
1

使用动态

 dynamic item = e.Item.DataItem;
 string style = item.Style;
于 2017-12-22T08:10:26.353 回答
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的代码可能会有所帮助)

于 2009-03-11T18:35:44.380 回答
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); 
              ...
于 2015-05-01T21:00:50.733 回答