2010-06-27 4 views
0

У меня есть пользовательский элемент управления, который я явно вызываю с страницы aspx. В Page_Load страницы ASPX я имею следующее:Пользовательское управление потерянное состояние

myControl = (DynamicTable)Page.LoadControl("../inc/DynamicTable.ascx");

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

pnlESDDEnrolled.Controls.Add(myControl);

где pnlESDDEnrolled является Я загружаю его для отображения.

Итак, я запускаю страницу aspx, она связывается с пользовательским элементом управления, заполняет элемент управления, возвращается на страницу aspx, и страница отображается с помощью элемента управления пользователя посередине. Все хорошо.

Проблема возникает при внесении обновлений в пользовательский элемент управления. Имейте в виду, что другие данные также обновляются на странице, а кнопка обновления находится на странице, а не в элементе управления. В любом случае, когда кнопка обновления нажата, на странице запускается событие button_click, но обновления, которые я сделал в пользовательском элементе управления, теряются. Поскольку страница загрузила пользовательский элемент управления, а затем usercontrol выполнил метод выгрузки страницы, страница больше не знает о пользовательском элементе управления. Таким образом, когда кнопка обновления на странице нажата, я думаю, я не совсем уверен, что происходит с обновленными данными в пользовательском элементе управления. Все, что я знаю, это то, что он потерян. Я работаю над этим в течение огромного количества времени, любая помощь будет очень признательна.

ответ

0

Я предполагаю, что, пока вы говорите о состоянии пользовательского управления, они реализованы как «Свойства» в коде?

Если это так, то вам, вероятно, придется использовать Viewstate для сохранения состояния UserControl, чтобы при возврате страницы UserControl сначала заново заполнился тем, что было ранее, когда оно было визуализировано. Это так же просто, как изменение любых свойств публичного состояния для использования ViewState в качестве стороннего.

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

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

В этом случае все зависит от того, в какой части жизненного цикла страницы вы это делаете. Вам нужно получить этот элемент управления в дереве страницы перед рендерингом (возможно предварительное рендеринг), так как именно в этот момент эта страница «захватывает» коллекцию своих элементов управления для целей сохранения состояния.

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

В равной степени - возможно, вы уже это делаете - в этом случае мне понадобится дополнительная информация (возможно, воспроизводимый сценарий), чтобы помочь исправить это.

+0

Большое спасибо за ответ. Вот что я вижу. Синьон - логика на странице aspx, на которой я вызываю pnlESDDEnrolled.Controls.Add (myControl); для ссылки на пользовательский элемент управления Page_Load, вызываемый в пользовательском элементе управления, заполняет данные в пользовательском элементе управления Saveviewstate - выполняется, но я сохраняю состояние только как page_unload - я ничего не делаю здесь. На странице aspx отображается экран – seattlesteve

+0

UPdates создаются на странице aspx, и кнопка управления пользователем и обновления на странице aspx нажата. Состояние загрузки отображается в пользовательском элементе управления. Код для поиска обновлений в пользовательском элементе управления вызывается, но обновления теряются. Сохраняя состояние состояния в пользовательском элементе управления Я выполняю myControl = (DynamicTable) Page.LoadControl ("../ inc/DynamicTable.ascx"); при загрузке страницы на странице aspx – seattlesteve

1

Вам также необходимо проверить IsPostBack в своем пользовательском контроле.

Как только ваша страница загружается, начинается страница Page_Load, после чего ваша страница__загрузки UserControl начнет, выполнит, затем ее события, а затем вернется к странице Page_Load, а затем ко всем ее событиям. Конечно, если вы используете Pre_Init на странице или переопределяете OnInit в своих элементах управления, эти события выполняются перед Page_Load.

Итак, если вы динамически создаете элементы в UserControl, проверьте IsPostBack и помещайте эти события в функцию OnInit в UserControl. Затем добавьте свою программную ссылку на этот UserControl в Page_Init страницы.

Смежные вопросы