![]() |
|
Модераторы: gambit |
![]()
|
|
| lankin |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 377 Регистрация: 13.12.2006 Репутация: нет Всего: нет |
Используется SqlDataSource и DetailsView. По кнопке "сохранить" связанные данные автоматом апдейтятся на базу.
В чем проблема: при формировании страницы есть чекбокс, который устанавливается, в зависимости от исходного значения. НО: при нажатии "сохранить" значение чекбокса почему то всегда такое, какое было при формировании страницы. Хотя я мог его изменить на True, все равно оно будет False. Может я не правильно его извлекаю(через FindControl)? |
||||
|
|||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 15 Всего: 62 |
lankin, это все проделки Web Forms...
Вот как развиваются события при постбэке: 1. DetailsView восстанавливается из ViewState 2. Присваиваются значения, пришедшие с постбэком (в частности, установлен ли CheckBox) 3. SqlDataSource загружает данные заново, при этом, естественно, теряется информация, выбран ли CheckBox. Самый простой workaround - грузить данные единожды (при первом запросе страницы), а потом восстанавливать их из ViewState. Для этого нужно убрать из разметки DetailsView значение DataSourceId и присваивать его в CodeBehind:
Не проверял, но должно сработать Это сообщение отредактировал(а) Idsa - 18.4.2009, 11:50 |
|||
|
||||
| lankin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 377 Регистрация: 13.12.2006 Репутация: нет Всего: нет |
Если делать так, то в Page_Load у меня нельзя найти ни один контрол внутри DetailsView. Дело в том, что в базе значения для чекбоксов представлены в виде INT, поэтому я по Page_Load просто запросом достаю эти значения и подставляю чекбокс.Чекед = тру или фалсе исходя из того 1 или 0 в базе. Если можно как-то иначе подменять автоматом значения в DetailsView при событии OnSelect и избежать этого геммороя в Page_Load, то будет как раз то, что нужно.
|
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 15 Всего: 62 |
lankin, нужно просто эту логику пенести в PreRender_Complete: там баиндинг уже произойдет, и у Вас будет доступ к контролам DetailsView. А можно пойти другим путем: в Page_Load вместе с присвоением DataSourceId вызвать вручную DataBind - тогда баиндинг произойдет незамедлительно и, опять же, станут доступны контролы DetailsView.
|
|||
|
||||
| lankin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 377 Регистрация: 13.12.2006 Репутация: нет Всего: нет |
Вынес в Page_PreRenderComplite, все работает, большое спасибо!
Такой вопрос: насколько целесообразно вынести эти преобразования (int -> bool) в хранимую процедуру? |
|||
|
||||
| lankin |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 377 Регистрация: 13.12.2006 Репутация: нет Всего: нет |
Сделал иначе: в SQLDataSource добавил поле для чекбокса, оно возвращает int(1 или 0). В aspx добавил такое
и в CodeBеhind
Вот и все. Не надо лишних запросов. |
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Разработка под ASP.NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |