|
|
|
GridView смена Parent и PostBack проблема потери данных
|
|||
|---|---|---|---|
|
#18+
Имею такую структуры в разметке Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. В рантайме требуется панель pSelectDepartments (которая содержит Грид) перенести в PlaceHolder phTmp Делаю так, в Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load phTmp.Controls.Add(pSelectDepartments) ' выполняется при каждой загрузке End Sub По нажатию кнопки заполняю Грид (вручную баинд). Грид отображается на странице, в новом месте, как и ожидается. После нажатия другой кнопки (PostBack) Грид пустой, даже gvDepartments.Rows.Count = 0 При этом, например, если рядом с Гридом положить Label и таким же манером присваивать Lablel.Text="...." , то надпись сохраняется. В чем проблема? Слышал, что при Controls.Add(Control) проблем со ViewState быть не должно, даже если создавать динамические контролы не в Page.Load а в обработчиках событий. Типа потому что при Controls.Add(Control) для контрола заново запускается событие Load восстановление ViewState и т.д. Сам сколько раз создавал динамические контролы, в том числе подгружал UserControl, никогда проблем не было (на всякий случай всегда делал это в Page.Load), правда в отличие от этого сейчас контрол не создается, а только перебрасывается в другое место страницы. Перевел phTmp.Controls.Add(pSelectDepartments) в событие PageInit содержимое грида перестало пропадать и визуально и судя по gvDepartments.Rows.Count. Но все равно осталась проблема, теперь gvDepartments.DataKeys.Count = 0 Прочитал, что DataKeys хранится не во ViewState, а в ControlState, но что из этого следует не понятно. Тем более прочитал, что ControlState хранится в том же поле на странице, что и ViewState. Естественно, если убрать (перемещение панели с Гридом) phTmp.Controls.Add(pSelectDepartments) то с Гридом все в абсолютном порядке! Т.е. вопроса 2 1) Почему в Page.Load после phTmp.Controls.Add(pSelectDepartments) теряется содержимое Грида? 2) Почему в Page.PageInit после phTmp.Controls.Add(pSelectDepartments) теряется содержимое DataKeys у Грида? Разбирался целые сутки, так и не понял в чем дело, в инете тоже на эту тему ничего не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2011, 16:22:17 |
|
||
|
GridView смена Parent и PostBack проблема потери данных
|
|||
|---|---|---|---|
|
#18+
Может я не прав, но мне кажется у вас не получится. Нужно создавать динамически GridView c теми же параметрами и пихать его в PlaceHolder ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2011, 16:49:44 |
|
||
|
GridView смена Parent и PostBack проблема потери данных
|
|||
|---|---|---|---|
|
#18+
Т.е. думаете, что при создании нового GridView или загрузке его в составе UserControl и помещении на страницу, однократном заполнении его данными и пересоздании при каждой загрузке страницы таким же манером, но без перезаполнения данными. Эти данные успешно будут сохраняться во ViewState и успешно восстанавливаться? А при перемещении GridView на странице такое успешное функционировании наблюдаться уже не будет и это никак не обойти? При том, что с Label тоже перемещение проходит успешно, его данные сохраняются. Интересно, с чем это связано? И почему нигде не описано. Кстати, провернул тоже самое с динамически заполняемым DropDownList тоже никаких проблем, перемещаю его в Page.Load (лежит на той же панели рядом с GridView), его содержимое никуда не девается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2011, 17:30:11 |
|
||
|
GridView смена Parent и PostBack проблема потери данных
|
|||
|---|---|---|---|
|
#18+
Andrey1306Может я не прав, но мне кажется у вас не получится. Нужно создавать динамически GridView c теми же параметрами и пихать его в PlaceHolder Можно и не динамически. Сделать такой-же GridView в phTmp и биндить один или другой. Для пользователя это будет выглядеть как-будто данные перетащили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2011, 17:31:14 |
|
||
|
GridView смена Parent и PostBack проблема потери данных
|
|||
|---|---|---|---|
|
#18+
StarlexAndrey1306Может я не прав, но мне кажется у вас не получится. Нужно создавать динамически GridView c теми же параметрами и пихать его в PlaceHolder Можно и не динамически. Сделать такой-же GridView в phTmp и биндить один или другой. Для пользователя это будет выглядеть как-будто данные перетащили. Я не думаю, что какое-то такое решение подойдет в моем случае. Идея в том, что на странице есть PopUpPanel (AJAX), с кучей антуража на ней, типа Caption, кнопок и т.д., который не хотелось бы размножать многократно. И на этом PopUpPanel панель нужно в зависимости от необходимости отображать то или иное сложное многоконтрольное содержимое, которое в обычном состоянии Visible = false на этой же странице. Когда я такие панели оформлял в виде UserControl, который загружал, то все получалось и с GridView тоже. А когда стал подставлять панели на странице, то не работает, причем пока только с GridView проблема. Label, DropDownList таких проблем нет. Причем не в PopUpPanel проблема, без нее тоже не работает - просто с перемещением GridView проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2011, 17:54:13 |
|
||
|
GridView смена Parent и PostBack проблема потери данных
|
|||
|---|---|---|---|
|
#18+
Да Вы правы , DropDownList при такой логике помещается в PlaceHolder с данными , и дополнительно биндить не нужно. а GridView нет. Может так и надо )). вынесите за пределы isPostBack заполнение и бинд грида ) . и он всегда будет с данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2011, 18:03:28 |
|
||
|
GridView смена Parent и PostBack проблема потери данных
|
|||
|---|---|---|---|
|
#18+
Andrey1306Да Вы правы , DropDownList при такой логике помещается в PlaceHolder с данными , и дополнительно биндить не нужно. а GridView нет. Может так и надо )). вынесите за пределы isPostBack заполнение и бинд грида ) . и он всегда будет с данными. Заполнять его данными при каждой загрузке страницы? На нем еще Чекбоксы в каждой строчке, т.е. он не просто отображает данные, но еще и запрашивает данные у пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2011, 18:26:04 |
|
||
|
GridView смена Parent и PostBack проблема потери данных
|
|||
|---|---|---|---|
|
#18+
Кому интересно, воспользовался своими старыми наработками с использованием UserControls - и у меня пока получается, что это единственная рабочая альтернатива. В таком случае GridView ведет себя прилично, восстанавливает свое состояние корректно. В этом варианте есть даже плюс - модульность, но не всегда удобно под каждый чих делать отдельные файлы с UserControl Получается, что если GridView создается на странице новый (в рантайме или грузится в составе UserControl), то он восстанавливает свое состояние корректно на PostBack, а если присутствует в разметке и в Page.Load (или даже Page.Init) меняет свое расположение на странице посредством Controls.Add(), то на PostBack восстанавливает свое состояние не корректно. Не исключено, что это как-то связано с ControlState. Но причина такого поведения GridView непонятна. Если кто-то сможет объяснить этот эффект и/или подскажет как его обойти, буду премного благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2011, 23:17:04 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=37548595&tid=1360260]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
264ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 610ms |

| 0 / 0 |
