Question

J'ai une page asp.net 2.0 contenant 2 UpdatePanels .

Le premier panneau contient un contrôle TreeView . Lorsque je sélectionne un nœud dans le contrôle à trois vues, il déclenche une mise à jour du deuxième UpdatePanel uniquement. Cela se comporte correctement.

Il y a deux boutons sur la page en dehors d'un panneau de mise à jour (précédent / suivant). Ces boutons déclenchent une mise à jour des deux panneaux. Le comportement des boutons consiste à sélectionner le nœud adjacent dans l'arborescence. La première fois que je clique sur l’un de ces boutons, le comportement attendu est affiché. Le nœud adjacent est sélectionné et les deux panneaux sont mis à jour pour refléter ce changement.

Le problème se produit lorsque je clique à nouveau sur l’un de ces boutons. Le nœud sélectionné de l'arborescence semble se souvenir du nœud précédemment sélectionné et les boutons agissent sur ce nœud. Le comportement des boutons précédent / suivant consiste donc à ne rien faire ou à revenir en arrière de deux.

Modifier - Exemple de code illustrant mon problème

Le balisage

 <asp:UpdatePanel ID="myTreeViewPanel" runat="server">
    <ContentTemplate>
       <asp:TreeView runat="server" ID="myTreeView" OnSelectedNodeChanged="myTreeView_SelectedNodeChanged">
          <SelectedNodeStyle BackColor="#FF8000" />
       </asp:TreeView>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID="myButton" EventName="Click" />
    </Triggers>
 </asp:UpdatePanel>
 <asp:UpdatePanel ID="myLabelPanel" runat="server">
    <ContentTemplate>
       <asp:Label runat="server" ID="myLabel" Text="myLabel"></asp:Label>
    </ContentTemplate>
    <Triggers>
       <asp:AsyncPostBackTrigger ControlID="myTreeView" EventName="SelectedNodeChanged" />
       <asp:AsyncPostBackTrigger ControlID="myButton" EventName="Click" />
    </Triggers>
 </asp:UpdatePanel>
 <asp:Button runat="server" ID="myButton" Text="myButton" OnClick="myButton_Click" />

Le code derrière

   protected void Page_Load ( object sender, EventArgs e )
   {
      if ( !IsPostBack )
      {
         myTreeView.Nodes.Add( new TreeNode( "Test 1", "Test One" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 2", "Test two" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 3", "Test three" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 4", "Test four" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 5", "Test five" ) );
         myTreeView.Nodes.Add( new TreeNode( "Test 6", "Test size" ) );
      }
   }
   protected void myTreeView_SelectedNodeChanged ( object sender, EventArgs e )
   {
      UpdateLabel( );
   }
   protected void myButton_Click ( object sender, EventArgs e )
   {
      // here we just select the next node in the three
      int index = myTreeView.Nodes.IndexOf( myTreeView.SelectedNode );
      myTreeView.Nodes[ index + 1 ].Select( );
      UpdateLabel( );
   }
   private void UpdateLabel ( )
   {
      myLabel.Text = myTreeView.SelectedNode.Value;
   }

C’est comme si l’état de la vue de l’arbre n’était pas sauvegardé?

Était-ce utile?

La solution

De Présentation du contrôle UpdatePanel [asp.net]

  

Contrôles non compatibles avec les contrôles UpdatePanel

     

Les contrôles ASP.NET suivants ne sont pas compatibles avec les mises à jour de page partielles et ne sont donc pas pris en charge dans un contrôle UpdatePanel:

     
      
  • Contrôles TreeView et Menu.
  •   
  • ...
  •   

Autres conseils

Je pense que vous avez raison en ce qui concerne la publication de page partielle AJAX selon laquelle il ne met pas à jour l'entrée cachée __ViewState.

J'ai la même chose avec mes panneaux de mise à jour lorsqu'un utilisateur revient aux pages du formulaire de demande de mon site Web. Les entrées normales ont mis à jour l'état de visualisation et leurs valeurs sont donc renseignées à nouveau, mais l'état des contrôles mis à jour avec AJAX n'est pas enregistré et ils retournent donc à l'état par défaut.

Je peux résoudre ce problème en enregistrant et en restaurant le nœud sélectionné dans l'état d'affichage de la page, en ajoutant simplement ces deux fonctions.

protected override object SaveViewState()
{
   ViewState["SelectedNodePath"] = myTreeView.SelectedNode.ValuePath;
   return base.SaveViewState();
}

protected void Page_PreLoad(object sender, EventArgs e)
{
   if (ViewState["SelectedNodePath"] != null)
   {
      TreeNode node = myTreeView.FindNode(ViewState["SelectedNodePath"].ToString());
      if (node != null)
         node.Select();
   }
}

Je ne peux pas charger le nœud sélectionné dans LoadViewState () car l’arborescence n’a aucun nœud à ce stade. Je le fais donc en préchargement.

Je me sens mal de la faire. Est-ce que je manque quelque chose?

Je suis confronté à un problème presque similaire. Je perds la collection CheckedNodes. Je doute que la même technique résoudra mes problèmes. Une idée?

Mise à jour: j'ai résolu le problème dans une large mesure et utilisé des solutions de contournement. Voir les détails ici: TreeView dans le numéro UpdatePanel - publications sur les cases à cocher et désélectionnées de la case à cocher du nœud et Utilisation de TreeView dans AJAX UpdatePanel

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top