Нужна помощь с жизненным циклом страницы (думаю, это меня облажает)

Я перетащил пустую таблицу asp.net на свою веб-форму. Я генерирую все строки в коде позади них.

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

Это все прекрасно работает. Однако, если у каждого из 2 столбцов есть "Present", то эти 2 столбца больше не должны отображаться, и 2 новых столбца заменяются другими выпадающими списками.

Это все работает. Однако вы должны обновить всю страницу, чтобы те 2 столбца, которые должны исчезнуть, исчезли.

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

if (IsPostBack == false)
{
    // check if dummy variables exist in db- If true just generate tables with values in db. If not generate them. 

}
else
{
   // grab the values from the database
   // generate tables with the values
}

btn click event
{
   go through all rows in table(foreach loop)
   update each column in the database with cells in each row. while in foreach loop.
   //done
}

Так вот как это происходит, и это работает ожидаемо (все правильные значения сохраняются), таблица просто не обновляется для пользователя.

Не работает

    if (IsPostBack == false)
    {
        // same code as above
    }

   // if postback is true do nothing. By the time it gets to the click event it says there is zero rows in the table so nothing happens.
    btn click event
    {
       // same code
    }

Сбой также.

if (IsPostBack == false)
{
   // same code as above
}
else
{
   // same code as above but moved into its own method.
   gernerateTable();
}

btn click event
{
   // update all rows
   // once done clear the Tables rows
   // call generateTable()
}

Этот последний ничего не делает, так как по какой-то причине он ничего не обновляет. Я не понимаю почему.

Так что я делаю не так с этим жизненным циклом, что-то в моем процессе не так? Код работает только тогда, когда я хочу, чтобы таблица была обновлена ​​сразу.

3 ответа

Решение

При создании страницы ASP.NET генерирует идентификаторы элементов управления по мере их создания. Эти идентификаторы отображаются в HTML и отправляются браузером обратно на сервер. Во время обратной передачи ASP.NET повторно генерирует элементы управления на странице для определения идентификаторов, а затем назначает значения данных для элементов управления из данных запроса.

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

OnPageLoad() {
  get data;
  build controls;
  bind data; 
}

OnButtonClick() {
  save data();
  build controls; // if changed by 'remove' or 'add'
  bind data;
}

Если вы добавляете элементы управления динамически на страницу, вам нужно перестроить их, прежде чем вы сможете что-либо с ними сделать.

Что я обычно делаю, чтобы полностью обойти эти типы проблем, - это использование повторителя. Затем вы можете выполнить цикл foreach еще в RepeaterItems. Это чисто и относительно просто. Нет проблем с жизненным циклом страницы.

Попробуйте переместить создание динамических элементов управления в событие инициализации страницы.

Другие вопросы по тегам