Управляет не сохранением значений после обратной передачи, когда FormView установлен в режим вставки - PullRequest
6 голосов
/ 15 апреля 2009

Я устанавливаю CurrentMode FormView для вставки режима, используя метод ChangeMode в событии Page_Load, например:

if(!Page.IsPostBack)
{
    MyFormView.ChangeMode(FormViewMode.Insert);
}

В шаблоне вставки моего FormView у меня есть элемент управления DropDownList с его свойством AutoPostBack, установленным в true. У меня также есть несколько других элементов управления DropDownList и TextBox в шаблоне вставки.

Всякий раз, когда я меняю выбор DropDownList и происходит обратная передача, я теряю все значения, введенные в элементы управления. Странно то, что если я использую ChangeMode, чтобы установить FormView для режима вставки в любое время после начальной загрузки страницы, у меня нет проблем. Я прошел по коду с помощью отладчика, и все, кажется, происходит правильно, но через некоторое время после запуска моего обработчика событий для DropDownList все кажется сброшенным.

Что здесь происходит?

Обновление: Я заметил, что мой FormView был внутри тега div с runat = "server" и enableviewstate = "false". Как только я включил viewstate для контейнера div, я начал видеть немного другое поведение. FormView по-прежнему не сохраняет значения после первой обратной передачи, но теперь последующие обратные передачи работают нормально, и значения сохраняются.

Любые идеи будут с благодарностью.

Ответы [ 6 ]

2 голосов
/ 04 марта 2010

Этот ответ с другого форума Уолтер Ванг [MSFT] - 26 января 2007 03:29 GMT

Во-первых, проблема заключается в том, что FormView определяется данными Исходный контроль, что данные изменились, и поэтому он должен перепривязать, чтобы получить новые данные. Это на самом деле не должно было быть сделано так как мы все еще в режиме вставки. У меня есть обходной путь для вашего ссылка: наследовать от FormView, чтобы создать свой собственный элемент управления FormView, переопределить OnDataSourceViewChanged и установить для RequDataBinding значение false если мы в режиме вставки:

public class MyFormView : FormView
   {
       protected override void OnDataSourceViewChanged(object sender,
EventArgs e)
       {
           if (this.CurrentMode == FormViewMode.Insert)
           {
               this.RequiresDataBinding = false;
           }
           else
           {
               base.OnDataSourceViewChanged(sender, e);
           }
       }
   }

Я проверил его на своей стороне, и, кажется, он работает правильно. Пожалуйста, дайте это попробуйте и дайте мне знать результат.

0 голосов
/ 05 августа 2010

У меня похожая проблема viewstate, которая не сохраняется в шаблоне EditItem Установка EnableViewState = true тоже не помогает.

Я получаю функцию OnUpdated(), а в самом конце

e.KeepInEditMode = true;

Надеюсь, это поможет ..

0 голосов
/ 03 июля 2009

FormView.ChangeMode (FormViewMode.Insert)

Это должно работать, проверить Id и использовать intelisense?

Мой пример с представлением формы добавления элемента ..

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    AddNewItemFormView.ChangeMode(FormViewMode.Insert)
End Sub

Попробуйте сделать это при загрузке страницы без каких-либо «if..then's», если это сработает, вы будете знать, что это не выражение, а, возможно, содержимое или конструкция if. Не забывайте указывать контрольные идентификаторы, чтобы было легче и с меньшей вероятностью допускать ошибки, когда вам нужно их использовать или вызывать их через intelisense.

Удачи.

:)

0 голосов
/ 17 апреля 2009

ViewState загружается до PageLoad, и я предполагаю, что при изменении режима на PageLoad воссоздается другой набор элементов управления, тех, что есть в вашем EditItemTemplate. Если он установлен по умолчанию в режим редактирования и вы раскомментируете эту строку в PageLoad, будет ли он поддерживать значения? Следует, если вы не переключаете режим.

0 голосов
/ 16 апреля 2009

попытаться изменить режим при инициализации страницы или событиях Prerender

0 голосов
/ 15 апреля 2009

Попробуйте

MyFormView.EnableViewState = true;
...