Nano Hash - криптовалюты, майнинг, программирование

Элемент управления ASP Repeater с несколькими шаблонами

Как я могу иметь элемент управления повторителем с несколькими шаблонами, где выбранный шаблон основан на типе элемента?

Это то, что у меня есть на данный момент:

Мой класс повторителя:

[ToolboxData("<{0}:LifestreamRepeater runat=server>")]
public class LifestreamRepeater : Repeater
{

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate TwitterTemplate {get; set;}


    protected override void OnDataBinding(EventArgs e)
    {
        //base.OnDataBinding(e);
        foreach (var item in (IEnumerable<LifestreamItem>)this.DataSource)
        {
            if (item is LifestreamTwitterItem)
            {
                LifestreamRepeaterItem ri = new LifestreamRepeaterItem(item);
                TwitterTemplate.InstantiateIn(item);
            }
            else
            {
                ItemTemplate.InstantiateIn(item);
            }
        }

    }
}

и передняя часть:

        <lfs:LifestreamRepeater runat="server" ID="repeater1">
            <TwitterTemplate>
                <div class="Lifestream Twitter Item">
                    <h4> <%# DataBinder.Eval(Container.DataItem, "Title")%> </h4>
                    <p>  <%# DataBinder.Eval(Container.DataItem, "Body")%> </p>
                </div>
            </TwitterTemplate>
            <ItemTemplate>
                <div class="Lifestream Item">
                    <h2> <%# DataBinder.Eval(Container.DataItem, "Title")%> </h2>
                    <p>  <%# DataBinder.Eval(Container.DataItem, "Body")%> </p>
                </div>
            </ItemTemplate>
        </lfs:LifestreamRepeater>

Затем я привязываю элемент управления повторителем к IEnumerable из LifestreamItem, который является базовым классом для нескольких различных типов сообщений в социальных сетях, поэтому могут быть TwitterLifestreamItem и VimeoLifestreamItem, и я хочу, чтобы повторитель выбирал другой шаблон с различными возможными значениями, в зависимости от элемента данных. .

21.07.2014

  • Аналогичный вопрос: stackoverflow.com/questions/5533604/ 22.07.2020
  • Это полезная ссылка, которая показывает все необходимые атрибуты шаблона (иначе не все функции будут работать, например Container.ItemIndex): docs.microsoft.com/en-us/dotnet/api/ 23.07.2020

Ответы:


1

Кажется, что решение состоит в том, чтобы переопределить метод DataBind следующим образом:

    public override void DataBind()
    {
        foreach (var item in (IEnumerable<LifestreamItem>)this.DataSource)
        {
            if (item is LifestreamTwitterItem)
            {
                TwitterTemplate.InstantiateIn(item); // instantiate inside the item which is also a control.
            }
            else
            {
                ItemTemplate.InstantiateIn(item);
            }
            item.DataBind(); // bind the item
            Controls.Add(item); // add the item to the repeater
        }
    }
22.07.2014

2

Я не думаю, что в ASP.NET есть что-то, что позволяет это сделать, но вы можете сделать это:

<asp:Repeater ID="myRepeater" runat="server" OnItemDataBound="myRepeater_ItemDataBound">
    <ItemTemplate>
        <asp:PlaceHolder ID="twitterTemplate" Visible="false" runat="server">
             <asp:Literal ID="fooTwitterControl" runat="server" />
        </asp:PlaceHolder>

        <asp:PlaceHolder ID="itemTemplate" Visible="false" runat="server">
             <asp:Literal ID="fooItemControl" runat="server" />
        </asp:PlaceHolder>
    </ItemTemplate>
</asp:Repeater>

И событие ItemDataBound:

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (ListItemType.Item == e.Item.ItemType || ListItemType.AlternatingItem == e.Item.ItemType)
    {
        PlaceHolder twitterTemplate = (PlaceHolder)e.Item.FindControl("twitterTemplate");
        PlaceHolder itemTemplate = (PlaceHolder)e.Item.FindControl("itemTemplate");

        var item = (LifestreamItem)e.Item.DataItem;
        if (item is LifestreamTwitterItem)
        {
            twitterTemplate.Visible = true;

            Literal fooTwitterControl = (Literal)e.Item.FindControl("fooTwitterControl");
            // Load all twitter related controls + populate
        }
        else
        {
            itemTemplate.Visible = true;
            Literal fooItemControl = (Literal)e.Item.FindControl("fooItemControl");
            // Load all non-twitter controls + populate
        }
    }
}

По сути, ItemTemplates становятся заполнителями и включаются/отключаются в зависимости от типа, который вы повторяете.

21.07.2014
  • Хотя это сработает, я действительно ищу что-то, что может быть легко и просто использовано дизайнерами. Могу ли я сделать пользовательский элемент управления для этого? 22.07.2014
  • @Steve Да, пользовательский элемент управления было бы относительно легко создать. Просто наследуйте от класса repeater 23.07.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..