Asp.net 如何在ItemDataBond期间访问数据绑定的项?

Asp.net 如何在ItemDataBond期间访问数据绑定的项?,asp.net,repeater,Asp.net,Repeater,我想在asp:repeater的ItemDataBound事件期间获取正在进行数据绑定的项 我尝试了以下方法(这在a中是一个无法接受的答案): 但是e.Item.DataItem为空 如何在名为ItemDataBound的事件期间访问数据绑定的项。我假设ItemDataBound事件发生在项目被数据绑定时 我想获得该对象,以便我可以采取步骤控制其显示方式,此外,该对象可能具有其他有用的属性,以便我丰富其显示方式 答复 我有正确的答案。答案是e.Item.Data仅在e.Item.ItemType

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

我尝试了以下方法(这在a中是一个无法接受的答案):

但是
e.Item.DataItem
为空

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

我想获得该对象,以便我可以采取步骤控制其显示方式,此外,该对象可能具有其他有用的属性,以便我丰富其显示方式

答复 我有正确的答案。答案是
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;
   ...
}

我马上就猜你需要这个:

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

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

如果您处理的是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的代码可能会有所帮助)

对于repeater

if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType...
可修改为:

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

我只想补充一点,我通过以下方式实现了这一点:

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

对于具有自定义模板绑定的中继器;您可以使用以下模板。我使用它创建了一个表,将每个数据项分解为两行,用于打印视图

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); 
              ...
Repeater1.HeaderTemplate=新的打印模板(ListItemType.Header);
Repeater1.ItemTemplate=新的打印模板(ListItemType.Item);
Repeater1.AlternatingItemTemplate=新的打印模板(ListItemType.AlternatingItem);
Repeater1.FooterTemplate=新的打印模板(ListItemType.Footer);
公共类打印模板:ITemplate
{
ListItemType模板类型;
公共打印模板(ListItemType)
{
模板类型=类型;
}
public void实例化EIN(System.Web.UI.Control容器)
{       
文字lc=新文字();
开关(模板类型)
{
案例ListItemType.Header:
立法会:"文本";;
容器。控件。添加(lc);
打破
案例列表项目类型。项目:
案例ListItemType.AlternatingItem:
//立法会:"文本";;
lc.DataBinding+=新事件处理程序(TemplateControl_DataBinding);
容器。控件。添加(lc);
打破
案例ListItemType.Footer:
立法会:"文本";;
容器。控件。添加(lc);
打破
}
}
私有void TemplateControl_数据绑定(对象发送方,
System.EventArgs(e)
{
文字信用证;
lc=(文字)发送方;
RepeaterItem容器=(RepeaterItem)lc.NamingContainer;
ListItemType itmType=container.ItemType;
//使用一个自定义函数构造中继器行,该函数打开项目类型;HEADER vs item vs ALTERNATINGITEM
lc.Text+=GetPopulatedRepeaterRow(dataInterface,container.DataItem,container.ItemType);
...
使用动态


是的,这是一个中继器上需要的。是的,我实际上编辑了几次,因为在测试中,没有检查就不会失败,所以对中继器几乎没有经验让我觉得他们没有。当然,我并没有实际添加标题来测试…我很聪明。虽然标题没有,但问题的第一行有;但是ckOverflow感谢您提供更多有用的资料。我相信该事件是在项目数据绑定后触发的。我想我曾经在PreRender事件中访问过数据。需要检查一些旧代码,尽管我个人倾向于按照答案的方式执行,因为这比随机返回退出更容易理解,尤其是在空白处方法,比如ItemDataBound.My just opinion这对我更有帮助,因为它提供了一个示例,说明如何根据名称检索特定列的信息。
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); 
              ...
 dynamic item = e.Item.DataItem;
 string style = item.Style;