【问题标题】:How to access the item being data bound during ItemDataBound?在ItemDataBound期间如何访问被数据绑定的项目?
【发布时间】:2010-09-25 12:50:48
【问题描述】:

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

我尝试了以下方法(这是 stackoverflow question 中未接受的答案):

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)时有效。其他时候它是无效的。就我而言,我在没有 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;
   ...
}

【问题讨论】:

  • 我相信事件是在项目被数据绑定之后触发的。我想我曾经在 PreRender 事件中访问数据。不过需要检查一些旧代码
  • 我个人更喜欢按照答案的方式来做,因为它比随机返回退出更容易理解,尤其是在 ItemDataBound 之类的 void 方法上。我的公正意见

标签: asp.net repeater


【解决方案1】:

马上我猜你需要这个:

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

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

【讨论】:

  • 是的,中继器需要这个
  • 是的,我实际上已经编辑了几次,因为在测试中没有检查它不会失败,所以对中继器的经验很少让我认为他们没有。当然,我实际上并没有添加一个 Header 来测试......我太棒了。
【解决方案2】:

我只是想补充一下,我确实通过执行以下操作完成了这一点:

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】:

对于中继器

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

可以修改为:

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

【讨论】:

    【解决方案4】:

    使用动态

     dynamic item = e.Item.DataItem;
     string style = item.Style;
    

    【讨论】:

      【解决方案5】:

      如果你正在处理一个 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 感谢您提供其他有用的材料。
      【解决方案6】:

      对于带有自定义模板绑定的转发器;您可以使用以下模板。我用它创建了一个表格,将每个数据项分成两行以供打印视图。

      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); 
                    ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多