Wie das Element für den Zugriff auf Daten, die während ItemDataBound gebunden zu sein?

StackOverflow https://stackoverflow.com/questions/344047

  •  19-08-2019
  •  | 
  •  

Frage

Ich möchte auf dem Element erhalten, die Daten gebunden werden, während die ItemDataBound Falle eines asp:. Repeater

Ich habe versucht, die folgenden (die eine nicht angenommene Antwort in einem war Frage Stackoverflow ):

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

aber e.Item.DataItem ist null.

Wie kann ich das Einzelteil ist, um Daten während der Veranstaltung gebunden Zugriff genannt ItemDataBound. Ich gehe davon aus das Ereignis ItemDataBound geschieht, wenn ein Element Daten gebunden wird.

Ich möchte auf dem Objekt bekommen, damit ich Schritte unternehmen, um zu steuern, wie es angezeigt wird, zusätzlich kann das Objekt hat weitere hilfreiche Eigenschaften, lassen mich bereichern, wie es angezeigt wird.

Antwort

Werkzeug hatte die richtige Antwort. Die Antwort ist, dass e.Item.Data nur dann gültig ist, wenn e.Item.ItemType ist (Item, AlternatingItem). Andere Male ist es nicht gültig. In meinem Fall erhielt ich ItemDataBound Ereignisse während Header (oder Fußzeile) Zeilen, in denen es keine DataItem ist:

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;
   ...
}
War es hilfreich?

Lösung

Rechts von der Fledermaus hätte ich Ihnen diese erraten müssen:

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

Schließlich ist das Element selbst sein könnte, eine Kopf- oder Fußzeile darstellt.

Andere Tipps

Ich wollte nur hinzufügen, dass ich das erreicht habe durch die folgenden Aktionen ausführen:

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

Für Repeater

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

Kann geändert werden:

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

Mit dynamischer

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

Wenn Sie mit einem asp zu tun hat: Listview, können Sie etwas tun:

    protected void myLV_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType != ListViewItemType.DataItem)
        return;

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

}

(Der Titel der Frage nicht erwähnt, einen asp: Repeater .. so dass ich dachte, es könnte hilfreich sein, den Code für eine ASP zu schreiben: listview)

Für einen Repeater mit einer benutzerdefinierten Vorlage zu binden; Sie können die folgende Vorlage verwenden. Ich habe diese eine Tabelle zu erstellen, die für die Druckansicht jedes Datenelement in zwei Zeilen nach unten bricht.

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); 
              ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top