DataItem на Repeater.Items всегда нулевой - PullRequest
4 голосов
/ 08 октября 2010

Я устанавливаю источник данных моего повторителя в список (MyProducts - простой класс, состоящий только из get / setters).

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

Почему DataItem не установлен для каждого RepeaterItemкогда я свяжу свой репитер?Я не могу понять / Google это.Все остальные аспекты моего кода работают правильно (вывод данных из 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, Марку Авениусу и всем остальным, кто подключился.

Ответы [ 2 ]

5 голосов
/ 08 октября 2010

Для чего вам нужен весь список?После визуализации страницы список, к которому привязан Repeater, не сохраняется.Если вам нужно сохранить его, вы можете поместить его в сеанс и получить его по мере необходимости (например, на 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>;
 }
}
2 голосов
/ 08 октября 2010

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

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

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

...