Почему последняя строка в повторителе не удаляется?

У меня есть данные ASP .NET Repeater, привязанные к DataTable. Все работает нормально, когда я могу добавить строки в DataTable и Bind(), и Repeater изящно покажет новые связанные данные и удалит их из DataTable и Bind(), а Repeater удалит данные.

Однако существует странная проблема, когда при удалении строк последняя стоящая строка, хотя и полностью удаленная из DataTable, все равно будет отображаться на веб-странице. Как будто для последней строки Repeater не привязан к данным! Но я поставил точки останова и проанализировал, что элемент определенно удаляется из DataTable, а также вызывается Repeater1.DataBound(). Если страница обновляется, последний элемент также удаляется (как и должно быть).

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

if (dtTelephoneNumbers.Rows.Count == 0)
                dtTelephoneNumbers.Clear();

Так почему же удаление всего остального работает отлично, а удаление последней стоящей строки — ошибочно? Любые идеи?

Вот мой код удаления.

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "DeleteNumber")
        {

            string[] commandArgs = e.CommandArgument.ToString().Split(new char[] { ',' });

            DataRow toDelete = dtTelephoneNumbers.Rows.Find(new object[] { commandArgs[0], commandArgs[1] });                

            dtTelephoneNumbers.Rows.Remove(toDelete);

            Debug.WriteLine("dtTelephoneNumbers count = " + dtTelephoneNumbers.Rows.Count);

            if (dtTelephoneNumbers.Rows.Count == 0)
                dtTelephoneNumbers.Rows.Clear();

            Repeater1.DataSource = dtTelephoneNumbers;

            Repeater1.DataBind();
        }
    }

Несколько дополнительных замечаний, которые могут быть полезны: Моя таблица данных является статической таблицей данных. В противном случае данные будут потеряны, когда произойдет обратная отправка.

public static DataTable dtTelephoneNumbers = new DataTable();

И все происходит внутри UpdatePanel, который находится внутри Wizard Step.

ОБНОВЛЕНИЕ 1: данные только локальные (на данный момент). Я собираю всю информацию от пользователя с помощью мастера и, наконец, добавляю ее в базу данных.

ОБНОВЛЕНИЕ 2: отлично работает при использовании без UpdatePanel. :( Похоже, что UpdatePanel как-то связан с этим!


person Ranhiru Jude Cooray    schedule 10.11.2010    source источник
comment
Держать DataTable как статический элемент — ужасная идея; только один человек сможет использовать страницу одновременно. Вместо этого храните данные в состоянии просмотра или сеансе пользователя.   -  person batwad    schedule 10.11.2010
comment
Большое спасибо за совет :) Я определенно должен был подумать об этом раньше!!! :О   -  person Ranhiru Jude Cooray    schedule 10.11.2010


Ответы (2)


Вам не нужно фиксировать изменения в DataTable с помощью dtTelephoneNUmbers.AcceptChanges()

person Preet Sangha    schedule 10.11.2010
comment
Только что попробовал, все равно не работает :( Большое спасибо за старания. - person Ranhiru Jude Cooray; 10.11.2010

Единственный способ, которым я мог справиться с ситуацией, — это удалить UpdatePanel из кода, и он отлично работал с полной публикацией на обратной стороне страницы!

person Ranhiru Jude Cooray    schedule 14.11.2010