Domanda

Ho una pagina asp.net 2.0 che contiene 2 UpdatePanels .

Il primo pannello contiene un controllo TreeView , quando seleziono un nodo nel controllo a tre viste, viene attivato solo un aggiornamento del secondo UpdatePanel . Questo si sta comportando correttamente.

Ci sono due pulsanti sulla pagina all'esterno di un pannello di aggiornamento (precedente / successivo). Questi pulsanti attivano un aggiornamento di entrambi i pannelli. Il comportamento dei pulsanti è selezionare il nodo adiacente nella struttura. La prima volta che faccio clic su uno di questi pulsanti ottengo il comportamento previsto e viene selezionato il nodo adiacente e entrambi i pannelli vengono aggiornati per riflettere questa modifica.

Il problema si verifica quando faccio nuovamente clic su uno di questi pulsanti. Il nodo selezionato della treeview sembra ricordare il nodo precedentemente selezionato e i pulsanti agiscono su questo nodo. Quindi il comportamento dei pulsanti precedente / successivo è di non fare nulla o tornare indietro di due.

Modifica : codice di esempio che dimostra il mio problema

Il markup

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

Il codice dietro

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

È come se il viewstate dell'albero non fosse salvato?

È stato utile?

Soluzione

Da Panoramica sul controllo UpdatePanel [asp.net]

  

Controlli non compatibili con i controlli UpdatePanel

     

I seguenti controlli ASP.NET non sono compatibili con gli aggiornamenti a pagina parziale e pertanto non sono supportati all'interno di un controllo UpdatePanel:

     
      
  • Controlli TreeView e Menu.
  •   
  • ...
  •   

Altri suggerimenti

Penso che tu abbia ragione sul postback della pagina parziale AJAX che non aggiorna l'input nascosto __ViewState.

Ho la stessa cosa con i miei pannelli di aggiornamento quando un utente torna alle pagine nel mio modulo di domanda del sito Web. Gli input normali hanno aggiornato il viewstate e quindi i loro valori vengono ripopolati ma lo stato dei controlli che sono stati aggiornati con AJAX non viene registrato e quindi tornano allo stato predefinito.

Posso risolvere questo problema salvando e ripristinando il nodo selezionato nello stato di visualizzazione della pagina, aggiungendo appena queste due funzioni.

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

Non riesco a caricare il nodo selezionato all'interno di LoadViewState () perché l'albero non ha nodi in quel punto. Quindi lo faccio in PreLoad.

Mi sembra sbagliato doverlo fare. Mi sto perdendo qualcosa?

Sto affrontando quasi un problema simile. Perdo la collezione CheckedNodes. Dubito che la stessa tecnica risolverà i miei problemi. Qualche idea?

Aggiornamento: ho risolto il problema in larga misura e ho usato alcune soluzioni alternative. Vedi i dettagli qui: TreeView all'interno del problema UpdatePanel - postback su check e deseleziona la casella di controllo del nodo e Uso di TreeView in AJAX UpdatePanel

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top