asp.net - route - ¿Cómo acceder al elemento vinculado a datos durante ItemDataBound?
select asp-for asp-items (6)
Quiero obtener el elemento que se está enlazando a datos, durante el evento ItemDataBound de un asp: repetidor.
Intenté lo siguiente (que fue una respuesta no aceptada en una pregunta de stackoverflow ):
protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Object dataItem = e.Item.DataItem;
...
}
pero e.Item.DataItem
es nulo.
¿Cómo puedo acceder al elemento vinculado a datos durante el evento llamado ItemDataBound? Supongo que el evento ItemDataBound ocurre cuando un elemento está siendo vinculado a datos.
Quiero llegar al objeto para poder tomar medidas para controlar cómo se muestra, además, el objeto puede tener propiedades útiles adicionales que me permitan enriquecer la forma en que se muestra.
Responder
La herramienta tenía la respuesta correcta. La respuesta es que e.Item.Data
solo es válido cuando e.Item.ItemType
es (Item, AlternatingItem). Otras veces no es válido. En mi caso, estaba recibiendo eventos ItemDataBound durante las filas del encabezado (o pie de página), donde no hay 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;
...
}
Si está tratando con un asp: ListView, puede hacer algo como esto:
protected void myLV_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType != ListViewItemType.DataItem)
return;
object dataItem = ((ListViewDataItem)e.Item).DataItem;
}
(El título de la pregunta no menciona un asp: repetidor ... así que pensé que podría ser útil publicar el código para una asp: listview)
Para repetidor
if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType...
Se puede modificar a:
if (e.Item.DataItem != null) ...
Solo quería agregar que logré esto haciendo lo siguiente:
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
}
}
}
Desde el principio, tendría que adivinar que necesitas esto:
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem)
{
//Put stuff here
}
Después de todo, el elemento en sí podría representar una fila de encabezado o pie de página.
Para un repetidor con un enlace de plantilla personalizado; puedes usar la siguiente plantilla. Lo usé para crear una tabla que descompone cada elemento de datos en dos filas para la vista de impresión.
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);
...
Usar dinámico
dynamic item = e.Item.DataItem;
string style = item.Style;