<Repeater id="infolist" runat="server>
<ItemTemplate>
這裏就是需要循環的內容了....
</ItemTemplate>
</Repeater>
這樣就可以了,很方便吧,這樣的話既使頁面再怎麼複雜也不會受到影響了,而且我在2.0中發現Repeater還可以嵌套,用起來真的挺自由的。雖然Repeater在前臺使用比較靈活自由,但有一個問題就是Repeater不支持直接分頁,這個很多人看起來就有點不想用了,但我想大家都知道GridView控件或DataGrid控件在啓用自帶分頁的時候其實效率是非常低的,大的不說,一但到了百萬級數據以後,就會感覺是多麼的痛苦和無耐了,所以既使是使用DataGrid(GridView)控件,高手們還是隻會只使用一個界面而已,而分頁肯定都是自己寫的,這樣一比較利弊就出來了,既然這樣那就選擇Repeater吧,我在這裏正好結合一下效率還算可以的雙top分頁法一起使用,對付百萬級的數據量是足夠了(如果還不夠的話那你只能另想他法或生成靜態了)
其實雙top的原理非常簡單,其實就是一句Sql語句,一看就明白!
int pagesize = 20;
int cpage = Convert.ToInt32(page);
string sql="";
string sqlstr = "select count(*) from komain_vote";
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
SqlCommand myCommand = new SqlCommand(sqlstr, myConnection);
myConnection.Open();
int totalput = Convert.ToInt32(myCommand.ExecuteScalar());
int maxpage = 1;
if (totalput % pagesize == 0)
{
maxpage = totalput / pagesize;
}
else
{
maxpage = totalput / pagesize + 1;
}
if (maxpage == 0) { maxpage = 1; }
if (cpage < 1) { cpage = 1; }
else if (cpage > maxpage) { cpage = maxpage; }
if (totalput != 0)
{
if (cpage == 1)
{
sql = "select top " + pagesize + " * from komain_vote order by id desc";
}
else
{
sql = "select top " + pagesize + " * from komain_vote where id not in(select top " + (cpage - 1) * pagesize + " id from komain_vote order by id desc) order by id desc";
}
}
SqlDataAdapter mysda = new SqlDataAdapter(sql, myConnection);
DataSet myds = new DataSet();
mysda.Fill(myds);
mysda.Dispose();
this.Label1.Text = "共有信息" + totalput.ToString() + "條 當前是第" + cpage.ToString() + "/" + maxpage.ToString() + "頁 ";
if(cpage!=1){
this.HyperLink1.Text="首頁";
this.HyperLink1.NavigateUrl="vote.aspx?page=1";
this.HyperLink2.Text="上一頁";
this.HyperLink2.NavigateUrl="vote.aspx?page="+Convert.ToString(cpage-1);}
else{
this.HyperLink1.Text="首頁";
this.HyperLink2.Text="上一頁";
}
if(cpage!=maxpage){
this.HyperLink3.Text="下一頁";
this.HyperLink3.NavigateUrl="vote.aspx?page="+Convert.ToString(cpage+1);
this.HyperLink4.Text="尾頁";
this.HyperLink4.NavigateUrl="vote.aspx?page="+maxpage.ToString();}
this.votelist.DataSource = myds.Tables[0].DefaultView;
this.votelist.DataBind();
runtime.Text = DateTime.Now.TimeOfDay.Subtract(newtimespan).TotalMilliseconds.ToString();//算出運行時間並附值給Label控件(runtime)
雖然看上去挺多的,但我是直接從vs裏複製出來的,所有的東西都比較全了,只是核心的話就一小段。
核心語句:sql = "select top " + pagesize + " * from komain_vote where id not in(select top " + (cpage - 1) * pagesize + " id from komain_vote order by id desc) order by id desc";
但我在這句的上頁加了一句(sql = "select top " + pagesize + " * from komain_vote order by id desc";)
這樣的話我覺得會有提高一點效率的功能,也就是說當前頁是第一頁的時候就不用再去計算分頁過程了,直接讀取20條數據就行了(在這裏我定義的是每頁顯示20條數據)
但這樣的話效率還不是非常高,相必都知道分頁中其實統計數據所佔的時間是比較長的,尤其是數據量非常大的時候,雖然count(*)已經很快了,但我給大家提個建議:“在數據庫裏新建一個表或xml文件,專門用來放統計信息數量的,這樣的話數據總數據就可以直接從數據庫或xml文件中讀取了,比統計來說那是快了不少(我在這裏說的都是針對大形數據庫的,如果本身的數據量都不超過1000就沒這個必要了)
注:我在自己的老本本上用一百萬條數據作測試,發現最快的時候在前幾百頁可以達到10~60毫秒之間,既使是翻到了最後一頁也只用了不到700毫秒,這個速度還算是比較理想吧,必竟我的本本太老了。^_^