Получить DataItem из RepeaterItem после привязки данных (во время обработки события) - PullRequest
3 голосов
/ 14 апреля 2009

Я пытаюсь найти способ сделать что-то, что, по моему мнению, должно быть возможным, но я просто упускаю суть - так что, надеюсь, кто-то может немного подтолкнуть меня:)

Я использую привязку данных в ASP.NET (viewstate выключен - поэтому использую controlstate для некоторых вещей здесь и там) для визуализации повторителя (repeaterPriceClasses), который имеет повторитель в каждом элементе шаблона (repeaterPriceBands). В основном это отображает таблицу из некоторого текста и выпадающий список в каждой ячейке.

Я пытаюсь найти способ перечислить repeaterOuter внутри обработчика событий кнопки, чтобы получить список всех изначально связанных элементов, которые теперь получили раскрывающийся список со значением> 0, и что это значение.

public Dictionary<Price, int> SelectedPrices
{
    get
    {
        var sel = new Dictionary<Price, int>();
        foreach(RepeaterItem itemClass in repeaterPriceClasses.Items)
        {
            var repeaterPriceBands = itemClass.FindControl("repeaterPriceBands") as Repeater;

            foreach(RepeaterItem itemBand in repeaterPriceBands.Items)
            {
                var context = (Price)itemBand.DataItem;
                var listQty = itemBand.FindControl("listQty") as DropDownList;

                if(listQty.SelectedValue.ToInt32() > 0)
                {
                    sel.Add(context, listQty.SelectedValue.ToInt32());
                }
            }
        }
        return sel;
    }
}

Теперь это не удается, потому что itemBand.DataItem всегда имеет значение null после завершения привязки данных.

Какую технику я должен использовать, чтобы обойти это?

  1. Скрытое поле с первичными ключами в нем (не идеально, так как может быть злоупотреблено и добавляет вес на страницу)

  2. Поиск от оригинальные кэшированные данные на основе индексов (просто кажется не правым)

  3. или что-то еще / лучше ...

РЕДАКТИРОВАТЬ: Есть ли еще какая-либо информация, которую я мог бы предоставить, чтобы помочь получить ответ?

1 Ответ

1 голос
/ 15 апреля 2009

Вы можете попробовать добавить дополнительные атрибуты к своим элементам HTML в событии ItemDataBound, когда DataItem доступен.

ddlSomething.Attributes["Attribute1"] = dataItemObject.PropertyName;

[Изменить] Помимо использования атрибутов, вы можете визуализировать некоторый массив, содержащий объекты JSON, как этот, для каждой строки.

var repeaterItemAttributes = [ { Prop1: val1, Prop2: val2, ... }, { ... }, ... ]

Таким образом, при использовании этого вам не придется отображать атрибуты, и ваш код будет также XHTML-совместимым (хотя это и не требуется). Затем вы можете просмотреть массив объектов и прочитать любое свойство, которое вам нравится. Вы также можете применить легкое шифрование, о котором вы говорили, к значениям свойств. [/ Edit]

...