DataItem на Repeater.Items всегда имеет значение null

Я устанавливаю DataSource моего повторителя в список (MyProducts — это простой класс, состоящий только из get/setters).

После этого и DataBind() я вижу в режиме отладки, что DataItem каждого Repeater.Items имеет значение null. При выполнении обратной передачи и попытке обновить MyProducts Repeater.Items[n].DataItem по-прежнему имеет значение null, и я не могу его использовать для выполнения своей работы.

Почему DataItem не устанавливается для каждого RepeaterItem, когда я привязываю данные к своему ретранслятору? Я не могу понять/погуглить. Все остальные аспекты моего кода работают правильно (вывод данных из MyProducts в aspx, используя, например:

<asp:TextBox runat="server" id="q" Text='<%# DataBinder.Eval(Container.DataItem, "Quantity")%>'></asp:TextBox>

Больше кода:

public class MyProducts
    {
        public string Number
        {
            get; set;
        }

        public decimal Price
        {
            get; set;
        }

        public decimal Quantity
        {
            get; set;
        }

        public decimal Total
        {
            get { return Quantity * Price; }
        }
    }

Генерация:

public List<MyProducts> TheProducts
{
 get { // Invoking webservice, getting response as xml and converting it to a list of MyProducts }
}

Мой пользовательский элемент управления:

// Bind products in cart
r.DataSource = TheProducts;
r.DataBind();
// Debugging "r.Items[n].DataItem" now shows "null", eventhough all objects has been correctly binded

Изменить № 2, информацию об отладке. DataSource загружается правильно, но Repeater.Items[3].DataItem имеет значение null. Это должно иметь значение, верно? скриншот


Изменить № 3, теперь я понял, я думал, что DataItem всегда доступен, когда установлен DataSource, и не думал о включении полного кода (я пытался получить к нему доступ в Page_Load).

После того, как пользователь отредактировал значение количества, я хотел сохранить новое количество для MyProducts. Я решил эту проблему, поместив скрытое поле, которое содержит идентификатор MyProducts, чтобы я мог вручную найти его и получить оттуда объект MyProducts.

Спасибо emremp, Марку Авениусу и всем остальным, кто принял участие.


person Certs    schedule 08.10.2010    source источник
comment
Вы могли бы дать нам код для работы с...   -  person Yves M.    schedule 08.10.2010
comment
Я отредактировал свой пост и вставил больше кода. Хотя это довольно просто, я не думаю, что это даст какие-либо разъяснения. Я надеялся, что пропустил что-то простое, и кто-нибудь мог указать на это для меня. Мне очень странно, что я могу связать объекты MyProduct, но DataItem имеет значение null...   -  person Certs    schedule 08.10.2010
comment
Чего вы пытаетесь достичь здесь? Привязывается ли ваше количество к ретранслятору?   -  person bla    schedule 08.10.2010
comment
Да, количество — это свойство MyProducts, которое привязывается к текстовому полю, поэтому пользователь может его редактировать. Это работает, как и ожидалось. Пользователь должен иметь возможность изменить количество, затем нажать «Сохранить» и запустить код через r.Items, сохраняя количество для каждого объекта MyProducts.   -  person Certs    schedule 08.10.2010
comment
Попробуйте просто ‹%#Eval(Quantity)%›   -  person Kadir    schedule 08.10.2010
comment
Хм, кажется, я не очень хорошо объясняю свою проблему :-). У меня нет проблем с получением количества (или любых других значений) во внешнем интерфейсе. Моя проблема в том, что мой ретранслятор кажется правильно загруженным и привязанным, но каждый RepeaterItem имеет значение null в своем DataItem (что я нахожу странным, потому что внешний интерфейс хорошо показывает количество и т. д.).   -  person Certs    schedule 08.10.2010


Ответы (2)


Для какой цели вам нужен весь список? После рендеринга страницы список, к которому привязан повторитель, не сохраняется. Если вам нужно сохранить его, вы можете поместить его в сеанс и извлечь его по мере необходимости (например, при Page_Load):

private List<MyProducts> _myList;
protected void Page_Load(object sender, EventArgs e)
{
    _myList = Session[MYPRODUCTSKEY] as IList;
}

Вы также можете поместить это в свой геттер (сначала проверьте сеанс и при необходимости вызовите веб-сервис):

public List<MyProducts> TheProducts
{
 get 
 { 
     if(Session[MYPRODUCTSKEY] == null)
         Session[MYPRODUCTSKEY] = //invoke webservice
     return Session[MYPRODUCTSKEY] as List<MyProducts>;
 }
}
person Mark Avenius    schedule 08.10.2010

http://www.netnewsgroups.net/aspnet/t4049-question-repeater-dataitem.aspx

«DataItem существует только для процесса создания элемента, то есть для методов ItemCreated и ItemDataBound (ItemCreated, когда это происходит из-за вызова DataBind)».

вы можете добавить метод ItemDataBound и попытаться получить DataItem.

person emremp    schedule 08.10.2010
comment
Правильно, но в любом случае после запуска событий привязки исходный список больше не сохраняется. Я думаю, что это было целью ОП. - person Mark Avenius; 08.10.2010
comment
Я имею в виду метод r_ItemDataBound(Object Sender, RepeaterItemEventArgs e), а не новый метод ItemDataBound. - person emremp; 08.10.2010