C#使用雙連結串列來實現模擬IE前進後退功能

iDotNetSpace發表於2009-04-20

簡單的測試了一下IE前進和後退的過程.

依次訪問網站A,B,C,D.

後退至 B,

然後重新請求網站E,

則記錄的儲存順序則是 A,B,E

C,D將會從記錄列表中刪除.

下面看程式碼(以下操作均在記憶體中進行):

一個History物件,用來生成一個記錄物件,該物件包含 url,title,html三個屬性.


<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtclass History
    
{
        
private string Title_ = "";
        
private string WmlSource_ = "";
        
private string Url_ = "";
        
public string Title
        
{
            
get return Title_; }
            
set { Title_ = value; }
        }

        
public string WmlSource
        
{
            
get return WmlSource_; }
            
set { WmlSource_ = value; }
        }

        
public string Url
        
{
            
get return Url_; }
            
set { Url_ = value; }
        }

        
public History()
        
{

        }

        
public History(string t, string w, string u)
        
{
            Title_ 
= t;
            WmlSource_ 
= w;
            Url_ 
= u;
        }

    }

  HistoryAction是對連結串列操作靜態類,具體看程式碼註釋

 
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtclass HistoryAction
    
{
        
//活動節點物件,即當前的節點物件
        private static LinkedListNode<History> HistoryCurrentNode= null;
        
//全域性的連結串列物件,所以記錄均儲存到該物件中
        private static LinkedList<History> HistoryList = new LinkedList<History>();
        
//設定儲存最大條數,當達到該條數時,每次增加記錄時,均依次刪除原有記錄
        private static int MaxList = 10;
        
/// 


       
/// 或取當前的記錄資訊
        
/// 
        public static History CurrentHistory
        
{
            
get return (History)HistoryCurrentNode.Value; }
        }

        
/// 
        
/// 當前後退時否可用,用於設定按鈕狀態資訊
        
/// 

        public static bool IsBack
        
{
            
get
            
{
                
return HistoryCurrentNode.Next == null ? false : true;
            }

        }

        
/// 
        
/// 當前前進時否可用,用於設定按鈕狀態資訊
        
/// 

        public static bool IsGo
        
{
            
get
            
{
                
return HistoryCurrentNode.Previous == null ? false : true;
            }

        }

        
/// 
        
/// 向歷史記錄連結串列中加入新的節點
        
/// 
        
/// 

        public static void Add(History h)
        
{
            LinkedListNode
<History> tem = HistoryList.First;
            
//如果連續加入url相同的記錄,則只加入一次,可以根據自已情況設定
            if (tem!=null && ((History)tem.Value).Url.ToLower() == h.Url.ToLower())
            
{
                
return
            }


            
//噹噹前節點不為空,或該節點的上一個節點也不為空時,則刪除該節點的前所有節點(模擬IE)
            
//模擬IE對前進後退的處理
            if (HistoryCurrentNode != null && HistoryCurrentNode.Previous != null)
            
{
                DelNode(HistoryCurrentNode);
            }


            
//處理限制最大記錄條數
            if (MaxList > 0)
            
{
                
if (HistoryList.Count + 1 > MaxList)
                
{
                    HistoryList.RemoveLast();
               }

            }

            HistoryCurrentNode 
= new LinkedListNode<History>(h);
            HistoryList.AddFirst(HistoryCurrentNode);
        }

        
/// 
        
/// 後退
        
/// 

        public static void Back()
        
{
            HistoryCurrentNode 
= HistoryCurrentNode.Next;
        }

        
/// 
       
/// 前進
        
/// 

        public static void Go()
        
{
            HistoryCurrentNode 
= HistoryCurrentNode.Previous;
        }

        
/// 
        
/// 刪除指定節點前所有節點
        
/// 
        
/// 

        private static void DelNode(LinkedListNode<History> node)
        
{
            
while (node.Previous != null)
            
{
                HistoryList.Remove(node.Previous);
            }

        }

        
    }

 

 頁面呼叫方法

 


<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt  private void AddHistory(string title, string wmlsource, string url) //將記錄加到列表中
        {
            History h 
= new History();
            h.Title 
= title;
            h.WmlSource 
= wmlsource;
            h.Url 
= url;
            HistoryAction.Add(h);
            RefurbishGoBackButton(); 
//重新整理按鈕狀態.由自已定義
        }

 
private void Back() //後退
        {
            HistoryAction.Back();
            History h 
= HistoryAction.CurrentHistory; //獲取後退後的History物件
            LoadHistory(h); //處理該物件,由自已定義.
            RefurbishGoBackButton();//重新整理按鈕狀態.由自已定義
        }

  
private void Go() //前進
        {
            HistoryAction.Go();
            History h 
= HistoryAction.CurrentHistory;
            LoadHistory(h); 
//處理該物件,由自已定義.
            RefurbishGoBackButton();//重新整理按鈕狀態.由自已定義
        }

OK,搞定,實際上非常簡單,這裡可以看到LinkedList的方便之處了.對效能的處理請自已把握.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-591020/,如需轉載,請註明出處,否則將追究法律責任。

相關文章