[ADO.NET]在 DataTable(DataSet) 亂數排序
前段時間有各小功能系統(ASP.NET 2.0),讀取XML的資料來源,都一直順利的運作,
突然客戶要求排序要每一次都動態亂數(Random)排序,就在想說是不是能在將XML讀取到
DataTable 後,在作亂數排序,就到 MSDN FORUM 搜尋一下,很幸運的找到這篇
回覆:DataTable/DataView可以進行隨機的排序嗎? 由 小朱 與 chhuang 提出很好的作法,
我就把這個範例整理出來, 運用在這個情境上,
狀況是有一個類似這樣的 XML 資料
<?xml version="1.0" encoding="utf-8"?>
<channel>
<item>
<ID>1</ID>
<title>Azure 服務平台 中文版網站正式上線</title>
</item>
<item>
<ID>2</ID>
<title>2009 年 1 月份 MSDN 研討會:從伺服器到雲端 – 在雲端運算中重複使用您的技能</title>
</item>
<item>
<ID>3</ID>
<title>Silverlight 應用範例 : 台北市民管樂團</title>
</item>
<item>
<ID>4</ID>
<title>Silverlight/XNA 修練大會正式開始</title>
</item>
<item>
<ID>6</ID>
<title>搶先下載 Internet Explorer 8</title>
</item>
</channel>
在沒有加入亂數排序的狀況下程式碼如下 :
protected void Page_Load(object sender, EventArgs e)
{
FillRepeater();
}
private void FillRepeater()
{
DataSet dsData = new DataSet();
dsData.ReadXml(Server.MapPath("XMLFile2.xml"));
DataTable dta = dsData.Tables[0];
Repeater1.DataSource = dta;
Repeater1.DataBind();
}
而這個案例中,需要能夠每次都亂數排序,所以可以從 DataTable 下手,
步驟是
1.在目前資料的DataTable中,加入一個數字欄位
2.按多少列資料,依序給予一個亂數值
3.將目前的DataTable 給到 DataView
4.針對 DataView 下排序指令 ( 排序剛亂數產生的欄位)
private void FillRepeater()
{
DataSet dsData = new DataSet();
dsData.ReadXml(Server.MapPath("XMLFile2.xml"));
DataTable dta = dsData.Tables[0];
//1.加入一個亂數數字欄位
dta.Columns.Add("RowID", typeof(int));
Random r = new Random();
//2/查出目前有多少列資料,就補上亂數欄位
foreach (DataRow row in dta.Rows)
{
row["RowID"] = r.Next(0, 100);
}
//透過將 DataTable 加入至 DataView
DataView view = new DataView(dta);
//針對 DataView 下 Sort 條件
view.Sort = "RowID DESC";
//再將以經亂數排序的DataView 給 Control
Repeater1.DataSource = view;
Repeater1.DataBind();
}
執行這段亂數版本的,就會看到以下的變化
從上面這個範例中,就可以知道不管資料來源是什麼,當資料到 ADO.NET DataTable (DataSet) ,
當無法在資料來源時下隨機排序時,就可以在 ADO.NET DataTable 增加一個欄位的方式,
來做隨機排序的功能,所以不管是哪一種Control 像範例中的 Repeater 或 DataGrid ,GridView ,DataList ,
資料來源都是同一種DataTable,都依這個方式就能達成一樣的效果。
參考資料:
回覆:DataTable/DataView可以進行隨機的排序嗎?( 這篇討論中還有其他值得參考的資訊,推薦大家可以去看)