熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#使用雙鏈表來實現模擬IE前進後退功能

2022-06-13   來源: .NET編程 

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

  依次訪問網站ABCD

  後退至 B

  然後重新請求網站E

  則記錄的保存順序則是 ABE

  CD將會從記錄列表中刪除

  下面看代碼(以下操作均在內存中進行):

  一個History對象用來生成一個記錄對象該對象包含 urltitlehtml三個屬性

  Code
class 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
class HistoryAction
{
//活動節點對象即當前的節點對象
private static LinkedListNode<History> HistoryCurrentNode= null;
//全局的鏈表對象所以記錄均保存到該對象中
private static LinkedList<History> HistoryList = new LinkedList<History>();
//設置保存最大條數當達到該條數時每次增加記錄時均依次刪除原有記錄
private static int MaxList = ;
/**//// <summary>
/// 或取當前的記錄信息
/// </summary>
public static History CurrentHistory
{
get { return (History)HistoryCurrentNodeValue; }
}
/**//// <summary>
/// 當前後退時否可用用於設置按鈕狀態信息
/// </summary>
public static bool IsBack
{
get
{
return HistoryCurrentNodeNext == null ? false : true;
}
}
/**//// <summary>
/// 當前前進時否可用用於設置按鈕狀態信息
/// </summary>
public static bool IsGo
{
get
{
return HistoryCurrentNodePrevious == null ? false : true;
}
}
/**//// <summary>
/// 向歷史記錄鏈表中加入新的節點
/// </summary>
/// <param name=h></param>
public static void Add(History h)
{
LinkedListNode<History> tem = HistoryListFirst;
//如果連續加入url相同的記錄則只加入一次可以根據自已情況設置
if (tem!=null && ((History)temValue)UrlToLower() == hUrlToLower())
{
return;
}

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

  //處理限制最大記錄條數
if (MaxList > )
{
if (HistoryListCount + > MaxList)
{
HistoryListRemoveLast();
}
}
HistoryCurrentNode = new LinkedListNode<History>(h);
HistoryListAddFirst(HistoryCurrentNode);
}
/**//// <summary>
/// 後退
/// </summary>
public static void Back()
{
HistoryCurrentNode = HistoryCurrentNodeNext;
}
/**//// <summary>
/// 前進
/// </summary>
public static void Go()
{
HistoryCurrentNode = HistoryCurrentNodePrevious;
}
/**//// <summary>
/// 刪除指定節點前所有節點
/// </summary>
/// <param name=node></param>
private static void DelNode(LinkedListNode<History> node)
{
while (nodePrevious != null)
{
HistoryListRemove(nodePrevious);
}
}

  頁面調用方法

  Code
private void AddHistory(string title string wmlsource string url) //將記錄加到列表中
{
History h = new History();
hTitle = title;
hWmlSource = wmlsource;
hUrl = url;
HistoryActionAdd(h);
RefurbishGoBackButton(); //刷新按鈕狀態由自已定義
}

  private void Back() //後退
{
HistoryActionBack();
History h = HistoryActionCurrentHistory; //獲取後退後的History對象
LoadHistory(h); //處理該對象由自已定義
RefurbishGoBackButton();//刷新按鈕狀態由自已定義
}

  private void Go() //前進
{
HistoryActionGo();
History h = HistoryActionCurrentHistory;
LoadHistory(h); //處理該對象由自已定義
RefurbishGoBackButton();//刷新按鈕狀態由自已定義
}

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

  好了如果有不合理的地方請大家指正


From:http://tw.wingwit.com/Article/program/net/201311/12193.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.