Мы создаем ASP. NET веб-приложение, которое отображает тестовые вопросы в ListView
. Каждый тип вопроса (истина / ложь, множественный выбор, короткий ответ и т. Д. c.) Требует разного макета в HTML.
. Я изучал сообщение от Microsoft (см. Рисунок 6) , который объясняет, как изменить <ItemTemplate>
ListView
на основе данных, содержащихся в шаблоне. Используя событие OnItemCreated
, которое запускается для каждого элемента в списке, я могу успешно изменить шаблон элемента ListView
в соответствии с типом задаваемого вопроса.
Однако, как говорится в статье, «если вы справитесь ItemCreated
и установите там свойство ItemTemplate
, изменение повлияет на следующий элемент, но не на элемент, обрабатываемый в данный момент. " Вот в чем проблема: вопросы получают шаблон по одному.
Решение этой статьи - переопределить класс ListView
, чтобы добавить новое событие. Это само по себе хорошо, но при использовании предложенного кода событие ItemCreating
не срабатывает. Автор начинает использовать <x:ListView>
вместо <asp:ListView>
, но он не объясняет, как ASP. NET захватывает свой пользовательский ListView
по умолчанию. Вот соответствующий код, который должен переопределить <asp:ListView>
и предоставить событие OnItemCreating
:
/// <summary>
/// Override to allow a <c>ListView</c> to have multiple <c>ItemTemplate</c>s depending on the
/// type of item being data bound.
/// https://docs.microsoft.com/en-us/archive/msdn-magazine/2008/april/cutting-edge-listview-tips-and-tricks#S5
/// </summary>
public class ListView : System.Web.UI.WebControls.ListView
{
public event EventHandler<ListViewItemCreatingEventArgs> ItemCreating;
private int mDisplayIndex;
private bool mShouldInstantiate = false;
protected override void InstantiateItemTemplate(Control container, int displayIndex)
{
if (mShouldInstantiate)
{
base.InstantiateItemTemplate(container, displayIndex);
mShouldInstantiate = false;
}
}
protected override ListViewDataItem CreateDataItem(int dataItemIndex, int displayIndex)
{
// Fire a NEW event: ItemCreating
ItemCreating?.Invoke(this, new ListViewItemCreatingEventArgs(dataItemIndex, displayIndex));
// Cache for later
mDisplayIndex = displayIndex;
// Call the base method
return base.CreateDataItem(dataItemIndex, displayIndex);
}
protected override void OnItemCreated(ListViewItemEventArgs e)
{
base.OnItemCreated(e);
mShouldInstantiate = true;
InstantiateItemTemplate(e.Item, mDisplayIndex);
}
}
Как использовать пользовательский ListView
с добавленным событием вместо значения по умолчанию ListView
без события?
Я попытался назвать переопределенный ListView
другим именем, но он не распознается как элемент управления. Это может быть связано с пользовательским префиксом <x:>
, но кто-то более знающий должен объяснить это ясно.