Добавление события ItemCreating в ListView - PullRequest
0 голосов
/ 10 февраля 2020

Мы создаем 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:>, но кто-то более знающий должен объяснить это ясно.

...