Нужна помощь с жизненным циклом страницы (думаю, это меня облажает)
Я перетащил пустую таблицу 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. Это чисто и относительно просто. Нет проблем с жизненным циклом страницы.
Попробуйте переместить создание динамических элементов управления в событие инициализации страницы.