Как получить доступ к элементу, связанному с данными во время ItemDataBound?
Я хочу получить элемент, связанный с данными, во время события ItemDataBound для asp: repeatater.
Я попробовал следующее (что было неприемлемым ответом в qaru.site/info/420946/...):
protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Object dataItem = e.Item.DataItem;
...
}
но e.Item.DataItem
имеет значение null.
Как я могу получить доступ к элементу, который привязан к данным во время события 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;
...
}
Ответы
Ответ 1
С самого начала я должен был предположить, что вам нужно это:
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem)
{
//Put stuff here
}
В конце концов, сам элемент может представлять строку заголовка или нижнего колонтитула.
Ответ 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
Если вы имеете дело с 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)
Ответ 5
Для ретранслятора с настраиваемой привязкой шаблона; вы можете использовать следующий шаблон. Я использовал это для создания таблицы, которая разбивает каждый элемент данных на две строки для просмотра.
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);
...
Ответ 6
Используйте динамический
dynamic item = e.Item.DataItem;
string style = item.Style;