Pregunta

Tengo una página asp.net 2.0 que contiene 2 UpdatePanels .

El primer panel contiene un control TreeView , cuando selecciono un nodo en el control de tres vistas, se activa una actualización del segundo UpdatePanel solamente. Esto se está comportando correctamente.

Hay dos botones en la página fuera de un panel de actualización (anterior / siguiente). Estos botones activan una actualización de ambos paneles. El comportamiento de los botones es seleccionar el nodo adyacente en el árbol. La primera vez que hago clic en uno de estos botones obtengo el comportamiento esperado, se selecciona el nodo adyacente y se actualizan ambos paneles para reflejar este cambio.

El problema ocurre cuando vuelvo a hacer clic en cualquiera de estos botones. El nodo seleccionado de la vista de árbol parece recordar el nodo previamente seleccionado y los botones actúan en este nodo. Entonces, el comportamiento de los botones anterior / siguiente es no hacer nada o saltar dos.

Editar : código de ejemplo que demuestra mi problema

El marcado

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

El código detrás

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

¿Es como que el estado de vista del árbol no se está guardando?

¿Fue útil?

Solución

De Descripción general del control de UpdatePanel [asp.net]

  

Controles que no son compatibles con los controles de UpdatePanel

     

Los siguientes controles ASP.NET no son compatibles con las actualizaciones parciales de la página y, por lo tanto, no son compatibles dentro de un control UpdatePanel:

     
      
  • TreeView y controles de menú.
  •   
  • ...
  •   

Otros consejos

Creo que tienes razón en cuanto a la devolución parcial de páginas de AJAX en que no actualiza la entrada oculta __ViewState.

Tengo lo mismo con mis paneles de actualización cuando un usuario navega de nuevo a las páginas en el formulario de solicitud de mi sitio web. Las entradas normales han actualizado el estado de visualización y, por lo tanto, sus valores se vuelven a llenar, pero el estado de los controles que se actualizaron con AJAX no se registra y, por lo tanto, vuelven al estado predeterminado.

Puedo solucionar este problema guardando y restaurando el nodo seleccionado en el estado de vista de las páginas, simplemente agregando estas dos funciones.

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

No puedo cargar el nodo seleccionado dentro de LoadViewState () porque el árbol no tiene ningún nodo en ese punto. Así que lo hago en PreLoad.

Simplemente se siente mal que tengo que hacer esto. ¿Me estoy perdiendo algo?

Estoy enfrentando casi un problema similar. Pierdo la colección CheckedNodes. Dudo que la misma técnica solucione mis problemas. ¿Alguna idea?

Actualización: solucioné el problema en gran medida y utilicé algunas soluciones. Vea los detalles aquí: TreeView dentro del tema UpdatePanel: devoluciones de datos al marcar y desmarcar la casilla de verificación del nodo y Uso de TreeView dentro de AJAX UpdatePanel

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top