ASP.NET/DataItem DataList имеет значение null после обратной передачи

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

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;
    }

Ответ 1

Нашел мой ответ здесь.

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

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

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

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

Ответ 2

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

Load предшествует Click, поэтому вы все равно перезаписываете свои данные.

Сделайте это:

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

Вы должны использовать источник данных (например, ObjectDataSource) для обработки привязки данных и обновления/вставки.

Обновление/совет:

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

Ответ 3

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