在.NET較早的版本里,您可能考慮使用SmartNavigation這個特性.SmartNavigation是Web
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" SmartNavigation="true" %> |
不過,正如好多人已經注意到的,SmartNavigation本身就有洗衣阿問題,事實上微軟也被這個問題所困擾以至于在ASP.NET2.0里添加了MaintainScrollbackPositionOnPostback屬性而取代SmartNavigation 。遺憾的是,我在使用它們時,感覺它們都有一些問題,我稍后將進行解釋。
本文我將介紹SmartNavigation和MaintainScrollbackPositionOnPostback 在維護頁面回發位置方面的缺點,并提供如何利用Javascript來解決這個問題,這個小技巧即使對復雜的Web頁面也同樣有效.
再見了SmartNavigationeb,歡迎MaintainScrollbackPositionOnPostback
下一步
ASP.NET2.0引進了MaintainScrollbackPositionOnPostback,和SmartNavigation類似,您可以在Page屬性里設置它的值為true或者為false。
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" MaintainScrollPositionOnPostback="true" %> |
非常簡明,這個屬性/屬性值對是用來維護頁面位置的。遺憾的是,它只是維護頁面的位置,因為如果你在用戶控件里使用了TreeView控件,然后在頁面里使用該用戶控件,那么頁面在在回發后您將返回到用戶控件的位置而不是TreeView節點位置。
在TreeView里維護控件的位置
首先,利用TreeView控件的SelectedNode屬性,可以知道哪個節點被選取,這個被選取的節點需要保存起來,它最終會程序為HTML元素。如果我知道了被選擇HTML控件的ID,那么我就可以滾動到該控件并設置該控件為當前焦點。確實,如果您看以下使用TreeView控件的頁面HTML代碼,你將發現生成的一個隱藏<input>元素,以及為textbox類型,它的ID可能類似TreeViewx_SelectedNode
<input type="hidden" name="TreeView1_SelectedNode" id="TreeView1_SelectedNode" value="TreeView1t54" /> |
為了具體說明做法,我使用TreeView編寫了一些代碼,在Page_Load時間里加載一段腳本來找到需要的單元格(參考下表),在<body>的onload時間里調用該函數.
Imports System.Collections.Generic Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load InjectLoadEvent() If (IsPostBack) Then Return TreeView1.Nodes.Clear() Dim chicken As New TreeNode("Chicken") TreeView1.Nodes.Add(chicken) Dim beef As New TreeNode("Beef") TreeView1.Nodes.Add(beef) Dim pork As New TreeNode("Pork") TreeView1.Nodes.Add(pork) Dim fish As New TreeNode("Fish") TreeView1.Nodes.Add(fish) chicken.ChildNodes.Add(New TreeNode("Crepes Florentine with Buffalo Chicken")) fish.ChildNodes.Add(New TreeNode("Linguine with White Clam Sauce")) pork.ChildNodes.Add(New TreeNode("Pork Loin with Peanut and Madarin Orange Sauce")) beef.ChildNodes.Add(New TreeNode("Standing Rib Roast with Fennel and Blue Cheese Potatoes")) ' We need a bunch of stuff here so we will add some stubs Dim I As Integer For I = 1 To 50 chicken.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString())) fish.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString())) pork.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString())) beef.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString())) Next TreeView1.CollapseAll() End Sub Public Sub InjectLoadEvent() Dim script As String = _ "function LoadEvent()" + _ "{{" + _ " try" + _ " {{" + _ " var elem = document.getElementById('{0}_SelectedNode');" + _ " if(elem != null )" + _ " {{" + _ " var node = document.getElementById(elem.value);" + _ " if(node != null)" + _ " {{" + _ " node.scrollIntoView(true);" + _ " {1}.scrollLeft = 0;" + _ " }}" + _ " }}" + _ " }}" + _ " catch(oException)" + _ " {{}}" + _ "}}" Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "LoadEvent", _ String.Format(script, TreeView1.ClientID, Panel1.ClientID), True) End Sub End Class |
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/