2010-08-20 3 views
10

После обратной передачи (нажмите кнопку) в моей форме ASP.NET весь DataItem моей формы равен null. Зачем? Что мне нужно сделать, чтобы получить содержимое DataList даже после обратной передачи?ASP.NET/DataItem DataList имеет значение null после Postback

protected void buttonAddRecord_Click(object sender, EventArgs e) 
    { 
     foreach (DataListItem item in listFields.Items) 
     { 
      // item.DataItem == null WTF? 
     } 
    } 

protected void Page_Load(object sender, EventArgs e) 
    { 
     BindFields(); 
    } 

private void BindFields() 
    { 
     object setting = MySettings.GetSetting(); 

     if (!Null.IsNull(setting)) 
     { 
      listFields.DataSource =  
       DataProvider.GetData(int.Parse(setting.ToString())); 
      listFields.DataBind(); 
     } 

     listFields.Visible = listFields.Items.Count > 0; 
     emptyMessage.Visible = listFields.Items.Count == 0; 
    } 

ответ

8

Обнаружили мой ответ here.

Что сказал Джон, данные источника данных доступны только при привязке данных. Они больше не доступны после начальная загрузка.

Вы могли бы рассмотреть наличие объекта или коллекцию объектов, представляющих на экран данные, которые обновляют с сетки, а затем сохраняются изменения от этого к базам данных.

Точнее, я использовал скрытый для хранения идентификатора через посты и я запрашиваю данные из базы данных вместо того, чтобы пытаться заставить его сформировать DataItem (который не может быть использована вне случае привязки данных).

Контроль HiddenField используется для магазина значения, которое должно быть сохранялись через сообщения на сервер.

+0

Ну, я не вижу другого выбора. И пока он работает очень хорошо. – asmo

+0

HiddenField работал для меня. Я использую ретранслятор и нуждаюсь в сохранении данных от привязки к нажатиям кнопок. – Cordell

+0

Это звучит как хороший способ сделать в два раза больше запросов к базе данных по мере необходимости. Кажется, что DataList может иметь плохую модель. – NetMage

1

Проверьте, действительно ли вы DataBind() DataList после каждой обратной передачи. Обычно вы получаете DataList, GridView, DropDownList (и другие элементы управления) пустые после PostBack, когда вы не связываете их снова.

+1

Спасибо за подсказку, но я действительно перепроверяю DataList даже при обратной передаче. Я также проверил в отладчике, и DataSource привязался к обратной передаче. – asmo

7

DataItem доступен только при привязке данных.

Load подходит к Click, так что вы все равно переписываете свои данные.

ли это:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     BindFields(); 
    } 
} 

Вы должны использовать DataSource (как ObjectDataSource) для обработки DataBinding и Update/Вставить.

Update/посоветуйте:

Использование заполнителей для привязки данных к вы получаете себя в неприятности. Вам следует рассмотреть возможность использования ListView, GridView, DataList или Repeater. Я уверен, что любой из них сделает то, что вы хотите, и вам придется программировать меньше. Используйте свое время, чтобы изучить их, а не пытаться заставить это работать, обреченное на неудачу.

+0

Я уже использую DataList (проверьте название). И я вынужден использовать PlaceHolder, так как я не могу заранее знать, каким будет тип Control для каждого поля. Фактически, каждый DataListItem моего DataList содержит один элемент управления PlaceHolder, тип которого будет определяться при привязке данных. – asmo

+0

Итак, что вы вкладываете в эти заполнители? – Jeroen

+0

Каждый заполнитель содержит один элемент управления, такой как TextBox, CheckBox, RadioButtonList, DropDownList и т. Д. Я не могу знать точный тип управления с его динамической. Каждый заполнитель представляет собой поле в форме, например, имя, адрес, адрес электронной почты, избранную пищу и т. Д. – asmo