2009-02-12 74 views

回答

7

您正在運行到這個問題,因爲當異步請求回來的UpdatePanel完全替換一個新的滾動<select>元素。

可能的解決方案:

  1. 使用JavaScript的<select>元素的scrollTop財產保存在一個隱藏的表單元素的UpdatePanel提交前(通過調用ClientScriptManager.RegisterOnSubmitStatement方法),然後將它設置在當AJAX調用返回時,新的<select>。這將是乏味的,容易出錯的,並且可能不是很兼容(參見here)。

  2. 使用JavaScript來存儲<select>selectedIndex屬性,並在AJAX調用返回時重新選擇該項。如果用戶還沒有選擇任何東西,這顯然不起作用。

  3. Don't use UpdatePanels。改爲嘗試jQuery + ASP.NET page methods

+1

我發現這個解決方案,它實際上工作。 http://basgun.wordpress.com/2008/06/09/maintain-scroll-position-updatepanel-postback/ – Xaisoft 2009-02-12 21:03:51

+0

好。這聽起來像IE6上的selectTop存在問題。本頁面的第一條評論解釋瞭如何解決該問題:http://geekswithblogs.net/lorint/archive/2005/12/16/63289.aspx – 2009-02-12 21:10:49

0

看來,在下列方式下面的代碼示例滾動:

  • 的Internet Explorer 8:回傳後所選擇的項目是第一個可見項目。

  • 火狐:回傳後所選擇的項目始終是可見的(但可能是最後一個可見項)。

  • 鉻:回發後,所選擇的項目可能會因爲列表框滾動到頂部被隱藏,就像你說的。

 
<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會滾動至頂端不可預知的位置。起初,我認爲這可能是因爲列表框中的項目數量太多,但是當選擇一個特定的項目時......有時它會在回發後保持可見狀態,有時Firefox會滾動到頂端。這個列表沒有被重建,同樣的事情發生時,任何項目被點擊,所以這顯然是一個Firefox的錯誤,它仍然存在3.0.13版本。 – Triynko 2009-08-07 14:57:46

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

//保持滾動位置的面板/格與出更新面板

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

您仍然可以實現使用含有ListBoxUpdatePanel的局部回傳,但防止它被覆蓋的一個新的實例通過設置在UpdatePanel如下:

ChildrenAsTriggers="False" 

這在MSDN的規定:

獲取或設置一個值,該值指示從UpdatePanel控件的即時 子控件的回發是否更新面板的內容。 如果您不希望將UpdatePanel控件的直接子控件的 回發更新爲 ,則將ChildrenAsTriggers屬性設置爲false會導致更新面板內容。

一個需要注意的情況是,如果你正在嘗試做任何其他的可視化操控,從服務器端(即添加CSS屬性上回發的項目)列表框,那麼你就不會看到他們渲染,直到另一個不相關的回發發生。如果你正在做的是選擇比設置ChildrenAsTriggers="False"將工作。

0

對於我正在開發的企業應用程序,事實證明,MasterPage.Master頁面正在處理Sys.WebForms.PageRequestManager.getInstance()。add_endRequest事件並在其中設置window.scroll(0,0)。內容頁顯然正在執行內容頁的UpdatePanel的每個觸發器上的window.scroll(0,0)。我嘗試覆蓋內容頁面中的add_endRequest功能,但無法使其工作。最終,我只是修改Master.Master,不做window.scroll(0,0)。

相關問題