ASP.NET / DataItem из DataList является нулевым после обратной передачи - PullRequest
10 голосов
/ 20 августа 2010

После обратной передачи (нажмите на кнопку) в моей форме ASP.NET все DataItem моей формы имеют нулевое значение.Зачем?Что я должен сделать, чтобы получить содержимое 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;
    }

Ответы [ 3 ]

9 голосов
/ 20 августа 2010

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

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

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

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

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

7 голосов
/ 20 августа 2010

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

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

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

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

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

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

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

1 голос
/ 20 августа 2010

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

...