2009-11-23 4 views
0

J'utilise une Listview dans un user-control que je répertorie à une liste d'objets dans l'événement de chargement de page.Databound Listview dans UpdatePanel

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

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

Je dois gérer l'insertion de nouveaux éléments dans la liste. Pour ce faire, j'ai ajouté un InsertItemTemplate avec un bouton qui a "Insert" comme argument de commande. Je ne veux pas conserver les données dans la base de données jusqu'à ce que l'utilisateur appuie sur le bouton Enregistrer, en bas du formulaire. Ainsi, en cas ItemCommand, voici mon code:

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; 
     } 

Cela fonctionne parfaitement bien jusqu'à ce que j'ajouter un UpdatePanel autour du listview. Lorsque j'ajoute un panneau de mise à jour, le gestionnaire Expression_ItemCommand est frappé uniquement toutes les 2 clics, même si la page est affichée à chaque clic. Pendant le débogage, je peux voir que j'entre l'événement Page_Load de la page à chaque clic sur le bouton Insérer, mais il frappe la commande Expression_Item seulement toutes les 2 clics. et réinitialiser le contenu de ma liste lorsque le ItemCommand n'est pas atteint. Je sens des problèmes ViewState ici, mais je ne peux pas comprendre comment résoudre ce problème.

Voici ce que le balisage ressemble:

<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"> 

... ...

Toute idée de comment résoudre ce problème?

Stéphane

Répondre

0

Après enquête looooong et reconstruction du contrôle de la page par le contrôle, la raison était que le viewstate a été comprimé et le ScriptManager na pas comme ça en quelque sorte, même si je précise le champ caché à elle.

Problème résolu ...

+0

Pouvez-vous s'il vous plaît publier plus de détails sur la façon dont vous avez résolu le problème? –

+0

nous compressions le viewstate en utilisant un algorithme base64 si je me souviens bien. Retrait de la compression a fait fonctionner. Je l'ai désactivé et je n'ai pas creusé plus loin parce que le gain n'était pas si important. –

Questions connexes