2009-11-23 4 views
0

Я использую Listview в usercontrol, который я привязываю к списку объектов в событии загрузки страницы.Databound Listview в UpdatePanel

protected void Page_Load(object sender, EventArgs e) 
     { 
      if (IsPostBack) return; 
      BindListViews(); 
     } 

    private void BindListViews() 
    { 
     MyListView.DataSource = IncludeExpressions;    
     MyListView.DataBind(); 
    } 

Мне нужно обработать вставку новых элементов в список. Для этого я добавил InsertItemTemplate с кнопкой «Вставить» в качестве аргумента команды. Я не хочу сохранять данные в базе данных до тех пор, пока пользователь не нажмет кнопку сохранения в нижней части формы. Таким образом, в случае ItemCommand, Вот мой код:

protected void Expression_ItemCommand(object sender, ListViewCommandEventArgs e) 
     { 
      var listView = (sender as ListView); 
      var expressions = GetExpressions(listView); 
      var newExpression = new Expression 
            { 
             CaseSensitive = ((CheckBox)e.Item.FindControl("CaseSensitiveCheckBox")).Checked, 
             SearchText = ((TextBox)e.Item.FindControl("SearchTextTextBox")).Text, 
             Scope = (Scope)Enum.Parse(typeof(Scope), ((DropDownList)e.Item.FindControl("ScopeDropDownList")).SelectedValue, true), 
             Type = (Type)Enum.Parse(typeof(Type), ((DropDownList)e.Item.FindControl("TypeDropDownList")).SelectedValue, true), 
            }; 
      expressions.Add(newExpression); 
      listView.DataSource = expressions; 
      listView.DataBind(); 
      UpdatePanelInclude.Update(); 
     } 

private List<Expression> GetExpressions(ListView lv) 
     { 
      var expressions = new List<Expression>(); 

      foreach (var row in lv.Items) 
      { 
       var searchText = ((TextBox)row.FindControl("SearchTextTextBox")).Text; 
       ... 
       expressions.Add(new Expression 
          { 
           CaseSensitive = caseSensitive, 
           Scope = scope, 
           Type = type, 
           SearchText = searchText 
          }); 
      } 
      return expressions; 
     } 

Это работает прекрасно, пока я не добавить UpdatePanel вокруг ListView. Когда я добавляю обновленную панель, обработчик Expression_ItemCommand попадает только каждые 2 клика, в то время как страница возвращается после каждого щелчка. Во время отладки я вижу, что я ввожу событие Page_Load страницы при каждом нажатии кнопки «Вставить», но попадает в Expression_ItemCommand только каждые 2 клика. и сбросить содержимое моего списка, когда ItemCommand не попал. У меня проблемы с ViewState здесь, но я не могу понять, как это исправить.

Вот что разметка выглядит следующим образом:

<asp:UpdatePanel ID="UpdatePanelInclude" UpdateMode="Conditional" ChildrenAsTriggers="true" runat="server"> 
<asp:ListView ID="MyListView" OnItemCommand="Expression_ItemCommand" OnItemInserting="ExpressionInserting" OnDataBinding="ListViewDataBinding" InsertItemPosition="LastItem" runat="server" ItemPlaceholderID="itemPlaceHolder"> 

... ...

Любая идея, как решить эту проблему?

Stéphane

ответ

0

После looooong исследований и восстановления контроля страницы с помощью контроля, причина заключалась в том, что ViewState прессовали и ScriptManager не понравилось как-то, даже если я указываю скрытое поле к нему.

Проблема решена ...

+0

Не могли бы вы предоставить более подробную информацию о том, как вы решили проблему? – 2011-04-29 19:06:13

+0

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

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