Wie das Element für den Zugriff auf Daten, die während ItemDataBound gebunden zu sein?
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;
...
}
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);
...