2009-02-12 22 views

risposta

7

si sta eseguendo in questo problema perché il UpdatePanel sostituisce completamente il tuo scorrere <select> elemento con una nuova quando la richiesta asincrona torna.

Possibili soluzioni:

  1. utilizzare JavaScript per memorizzare la proprietà scrollTop dell'elemento <select> in un elemento di modulo nascosto prima della UpdatePanel viene sottoposto (chiamando il metodo ClientScriptManager.RegisterOnSubmitStatement) e quindi impostando sul nuovo <select> quando la chiamata AJAX ritorna. Questo sarà noioso, soggetto a errori e probabilmente non molto compatibile (vedere here).

  2. Utilizzare JavaScript per memorizzare la proprietà selectedIndex di <select> e selezionare nuovamente tale voce quando la chiamata AJAX ritorna. Ovviamente questo non funzionerà se l'utente non ha ancora selezionato nulla.

  3. Don't use UpdatePanels. Prova invece a jQuery + ASP.NET page methods.

+1

Ho trovato questa soluzione e in realtà ha funzionato. http://basgun.wordpress.com/2008/06/09/maintain-scroll-position-updatepanel-postback/ – Xaisoft

+0

Buono. Sembra che ci sia un problema con selectTop su IE6. Il primo commento in questa pagina spiega come aggirarlo: http://geekswithblogs.net/lorint/archive/2005/12/16/63289.aspx –

0

Sembra che il seguente codice di esempio scorre nel modo seguente:

  • Internet Explorer 8: dopo il postback l'elemento selezionato è il primo elemento visibile.

  • Firefox: dopo il postback l'elemento selezionato è sempre visibile (ma potrebbe essere l'ultimo elemento visibile).

  • Chrome: dopo il postback, l'elemento selezionato potrebbe essere nascosto poiché la casella di riepilogo scorre verso l'alto, come dici tu.

 
<asp:UpdatePanel ID="up1" runat="server"> 
    <ContentTemplate> 
     <asp:ListBox ID="lb1" runat="server" Height="100px" AutoPostBack="true"> 
      <asp:ListItem>A</asp:ListItem> 
      <asp:ListItem>B</asp:ListItem> 
      <asp:ListItem>C</asp:ListItem> 
      <asp:ListItem>D</asp:ListItem> 
      <asp:ListItem>E</asp:ListItem> 
      <asp:ListItem>F</asp:ListItem> 
      <asp:ListItem>G</asp:ListItem> 
      <asp:ListItem>H</asp:ListItem> 
     </asp:ListBox> 
    </ContentTemplate> 
</asp:UpdatePanel> 
+0

Firefox scorre in alto in modo imprevedibile per gli elementi selezionati. All'inizio pensavo che potesse essere dovuto al numero di elementi nella casella di riepilogo, ma quando si seleziona un particolare oggetto ... a volte rimane visibile dopo un postback e, a volte, Firefox si sposta in alto. L'elenco non viene ricostruito e la stessa cosa è accaduta quando si fa clic su qualsiasi elemento, quindi è chiaramente un bug di Firefox ed è ancora presente dalla versione 3.0.13. – Triynko

4
var xPos, yPos; 
    var prm = Sys.WebForms.PageRequestManager.getInstance(); 

    function BeginRequestHandler(sender, args) { 
     if (($get('Panel1')) != null) { 
      xPos = $get('Panel1').scrollLeft; 
      yPos = $get('Panel1').scrollTop; 
     } 
    } 

    function EndRequestHandler(sender, args) { 
     if (($get('Panel1')) != null) { 
      $get('Panel1').scrollLeft = xPos; 
      $get('Panel1').scrollTop = yPos; 
     } 
    } 
    prm.add_beginRequest(BeginRequestHandler); 
    prm.add_endRequest(EndRequestHandler); 

    //Note: "Panel1" Panel or div u want to maintain scroll position 
    //Note: This Java Script should be added after Scriptmanager***** 

// Mantenere posizione di scorrimento per il pannello/Div con fuori pannello di aggiornamento

window.onload = function() { 
     var strCook = document.cookie; 
     if (strCook.indexOf("!~") != 0) { 
      var intS = strCook.indexOf("!~"); 
      var intE = strCook.indexOf("~!"); 
      var strPos = strCook.substring(intS + 2, intE); 
      document.getElementById('Panel1').scrollTop = strPos; 
     } 
    } 
    function SetDivPosition() { 
     var intY = document.getElementById('Panel1').scrollTop; 
     document.title = intY; 
     document.cookie = "yPos=!~" + intY + "~!"; 
    } 


    //Note: "Panel1" Panel id or div id for which u want to maintain scroll position 
+0

Ho dovuto apportare una leggera modifica e utilizzare quanto segue per farlo funzionare: 'yPos = $ ('# <% = MyListBox.ClientID%>'). ScrollTop();' per estrarre i dati in 'beginRequestHandler', e '$ ('# <% = MyListBox.ClientID%>'). ScrollTop (yPos);' per rimetterlo in 'endRequestHandler'. – atconway

0

è ancora possibile ottenere il postback parziale utilizzando la UpdatePanel contenente un ListBox, ma prevenirlo da essere sovrascritto da una nuova istanza impostando quanto segue su UpdatePanel:

ChildrenAsTriggers="False" 

Questo come detto nella MSDN:

Ottiene o imposta un valore che indica se postback da immediati controlli figlio di un controllo UpdatePanel aggiornare il contenuto del pannello. Impostare la proprietà ChildrenAsTriggers su false se NON si desidera che i postback da controlli figlio immediati del controllo UpdatePanel a causino un aggiornamento del contenuto del pannello.

L'unico avvertimento a questo è se si sta cercando di fare qualsiasi altra manipolazione visiva al ListBox dal lato server (ad esempio l'aggiunta di CSS attributi alle voci su postback), allora non li vedi rendono fino si verifica un altro postback non correlato. Se tutto quello che stai facendo è effettuare selezioni che impostare funzionerà.

0

Per l'applicazione aziendale su cui stavo lavorando, si è scoperto che la pagina MasterPage.Master stava gestendo l'evento Sys.WebForms.PageRequestManager.getInstance(). Add_endRequest e impostando window.scroll (0,0) al suo interno. Le pagine di contenuto stavano ovviamente eseguendo window.scroll (0,0) su ogni trigger del UpdatePanel della pagina di contenuto. Ho provato a sovrascrivere la funzionalità add_endRequest nella pagina dei contenuti, ma non ho potuto farlo funzionare. Alla fine ho solo modificato il Master.Master per non fare window.scroll (0,0).

Problemi correlati