在ASP.NET Portal Starter Kit中有在列表框中選擇指定項,通過點擊上下按鈕來實現排序的功能(如)。
通常我想到的方法是(以:上移為例):擷取選中項的排序號和選中項的上一項的排序號,交換它們的排序號即可。排序號的方式,就以1,2,3,4……的形式,建立的標籤的序號在最後一個的基礎上加一。在ASP.NET Portal Starter Kit中採取的方式是:通過1,3,5,7……的形式來表示排序號,每一次增刪都重新構造排序號。在上移時,將當前的排序號減3,這樣新的排序號就在它原來上一位的前面,且在上兩位的後面。如:將第7位上移,那麼新的順序是1,3,4,5,9。
代碼如下(部分代碼,詳細的可對照Tabs.ascx.cs中的代碼看):
//上移下移代碼
if (tabList.SelectedIndex != -1)
{
int delta;
//因為標籤排序號是1,3,5,7,9方式排列的
//將一個標籤的上移或下移一位,就把標籤序號加減3,正好為一偶數就在前後一位的前面或後面。
//如:將第7位上移,那麼新的順序是1,3,4,5,9
if (cmd == "down")
{
delta = 3;
}
else
{
delta = -3;
}
TabItem t;
t = (TabItem) portalTabs[tabList.SelectedIndex];
t.TabOrder += delta;
// 重新排序構造新的排序號
OrderTabs();
}
/**//// <summary>
/// 將portalTabs中的標籤排序
/// </summary>
private void OrderTabs ()
{
int i = 1;
// 使用指定的比較子對部分 System.Collections.ArrayList 中的元素進行排序。
// portalTabs中的對象是TabItem,TabItem對象繼承了IComparable介面,實現了以TabOrder的CompareTo
portalTabs.Sort();
// renumber the order and save to database
// 將排序後的資訊存入XML
foreach (TabItem t in portalTabs)
{
// 將標籤的排序號按1, 3, 5,遞增的順序排列
t.TabOrder = i;
i += 2;
// 將新的排序號寫入使用者設定檔
Configuration config = new Configuration();
config.UpdateTabOrder(t.TabId, t.TabOrder);
}
}
這種方法其實我覺得並不好,只能算是一個新的思路。在OrderTabs()時每次都要迴圈更新使用者設定檔,我覺的還不如,交換序號後在更新使用者設定檔。但是用交換序號的方式,要判斷是否選中項為第一項(不能上移)或是最後一項(不能下移)。而且程式中還有要將管理項作為最後一項的要求,用交換序號的方式可能又要多寫不少代碼。可能還有其他的好處我沒有想到,所以權衡利弊還是用他的方法吧!
順便說一個Bug,好像預設提供的程式不能實現上移下移的功能,不知大家遇到了沒有。要將Configuration.cs檔案中SaveSiteSettings()的方法修改一下才行,修改後的代碼:
public void SaveSiteSettings()
{
// 原來的:從Cache中擷取網站設定資訊資料集(好像是個Bug,因為每次更新資料是更新的HttpContext.Current.Items中的)
//SiteConfiguration siteSettings = (SiteConfiguration) HttpContext.Current.Cache["SiteSettings"];
// 修改後的
SiteConfiguration siteSettings = (SiteConfiguration) HttpContext.Current.Items["SiteSettings"];
// 如果Cache中沒有,則重新構建
if(siteSettings == null)
{
// If SaveSiteSettings() is called once, the cache is cleared. If it is
// then called again before Global.Application_BeginRequest is called,
// which reloads the cache, the siteSettings object will be Null
// (這一句不知翻譯的對不對,好像很重要)如果SaveSiteSettings()被調用過一次後,Cache就回被清除。如果它再一次被調用在Global.Application_BeginRequest前siteSettings為null則重新寫Cache
siteSettings = GetSiteSettings();
}
string configFile = HttpContext.Current.Server.MapPath(ConfigurationSettings.AppSettings["configFile"]);
// Object is evicted from the Cache here.
// 將變更後的資料集寫入到Xml檔案
siteSettings.WriteXml(configFile);
}
更多相關內容:點擊這裡>>