چند تا كد آماده ديدم كه اين كار رو انجام دادن اما اكثرا اطلاعات رو از بانك اطلاعاتي Load مي كنن و صفحه بندي اطلاعات رو توي Presentation layer يا Data Access Layer انجام مي دن. اما قابليتي كه SQLSERVER 2005 داره اين امكان رو مي ده كه فقط ركورد هايي رو كه مي خوايم به كاربر نمايش بديم رو Load كنيم. اين جوري Performance كار خيلي بالا مي ره.
براي اينكه بتونيم يه Data Paging محكمه پسند ارائه بديم چند تا كار بايد بكنيم. اول يه مثال از دستوري كه Paging داده ها رو انجام ميده مي زنم كه ببينيد sql server اين امكان رو چطوري پشتيباني مي كنه.
SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY [Id]) AS RowNum, [Field1], [Field2] FROM [TableName] WHERE [Name]='Fana') AS MainQuery WHERE RowNum>=10 AND RowNum<20
با يه همچين كدي مي تونيد ركوردهاي 10 تا 20 رو از بانك اطلاعاتي Load كنيد. براي اينكه بتونيد به تعداد صفحات اطلاعات براي كاربر لينك بزاريد، توصيه مي كنم يه كنترل درست كنيد كه اين كار رو براتون انجام بده. با استفاده از ويژوال استوديو مي تونيد يه Web Custom Control درست كنيد كه برنامه نويس فقط تعداد ركوردها رو بش پاس بده و نگران بقيه قسمت هاي كار نباشه. كد يه Custom Control رو اينجا آوردم كه با همون شرايطي كه نوشتم كار مي كنه. درضمن يه Event هم بش اضافه كردم كه برنامه نويس مي تونه تشخيص بده كاربر درخواست يه Page جديد داشته يانه؟ اين كنترل 5تا لينك رو نمايش مي ده (Section 1) و با كليك كاربر بر روي لينك صفحه پنجم، اين 5تا لينك، شماره هاشون تبديل به 3 تا 7 مي شه(Section2) اين طوري كاربر هميشه 5 تا لينك توي صفحه داره كه هرچقدر جلو بريم شماره هاي لينك ها افزايش پيدا مي كنه
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
[assembly:TagPrefix("FanaCustomControls","fcc")]
namespace FanaCustomControls
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:DataPaging runat=server>{0}:DataPaging>")]
public class DataPaging : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
#region Properties
private int _SectionIndex = 1;
private int _SectionCount = 1;
private int _PageSize = 10;
///
/// تعداد رکوردهای هر صفحه. به صورت پیش فرض هر صفحه 10 رکورد را نمایش می دهد
///
public int PageSize
{
get { return _PageSize; }
set { _PageSize = value; }
}
private long _RecordCount;
///
/// تعداد کل رکوردهایی که قرار است صفحه بندی شوند
///
public long RecordCount
{
get { return _RecordCount; }
set
{
_RecordCount = value;
//تعیین تعداد صفحات
PageCount = (int)value / _PageSize + 1;
}
}
private int _PageCount;
///
/// تعداد کل صفحات
///
public int PageCount
{
get { return _PageCount; }
set
{
_PageCount = value;
int counter = 5;
_SectionCount = 1;
while (counter < value)
{
counter += 2;
_SectionCount++;
}
CreateChildControls();
}
}
private int _PageIndex = 1;
///
/// شماره صفحه جاری
///
public int PageIndex
{
get { return _PageIndex; }
set { _PageIndex = value; }
}
#endregion
#region ControlsOnTheForm
private LinkButton lnkBtn1;
private LinkButton lnkBtn2;
private LinkButton lnkBtn3;
private LinkButton lnkBtn4;
private LinkButton lnkBtn5;
#endregion
#region Events_Methods
public EventHandler SelectedPageChanged;
public void OnBtn1Click(Object o, System.EventArgs ea)
{
try
{
_PageIndex = Convert.ToInt32(lnkBtn1.Text);
if (_SectionIndex > 1)
{
ReduceSectionIndex();
}
if (SelectedPageChanged != null)
{
SelectedPageChanged(this, EventArgs.Empty);
}
}
catch
{
throw;
}
}
public void OnBtn2Click(Object o, System.EventArgs ea)
{
try
{
_PageIndex = Convert.ToInt32(lnkBtn2.Text);
if (SelectedPageChanged != null)
{
SelectedPageChanged(this, EventArgs.Empty);
}
}
catch
{
throw;
}
}
public void OnBtn3Click(Object o, System.EventArgs ea)
{
try
{
_PageIndex = Convert.ToInt32(lnkBtn3.Text);
if (SelectedPageChanged != null)
{
SelectedPageChanged(this, EventArgs.Empty);
}
}
catch
{
throw;
}
}
public void OnBtn4Click(Object o, System.EventArgs ea)
{
try
{
_PageIndex = Convert.ToInt32(lnkBtn4.Text);
if (SelectedPageChanged != null)
{
SelectedPageChanged(this, EventArgs.Empty);
}
}
catch
{
throw;
}
}
public void OnBtn5Click(Object o, System.EventArgs ea)
{
try
{
_PageIndex = Convert.ToInt32(lnkBtn5.Text);
if (_SectionCount > _SectionIndex)
{
AddSectionIndex();
}
if (SelectedPageChanged != null)
{
SelectedPageChanged(this, EventArgs.Empty);
}
}
catch
{
throw;
}
}
public void AddPageIndex(int count)
{
try
{
_PageIndex += count;
int Start = _SectionIndex + _SectionIndex - 1;
if (_PageIndex == Start)
{
ReduceSectionIndex();
}
if (_PageIndex == Start + 4)
{
AddSectionIndex();
}
}
catch
{
throw;
}
}
public void ReducePageIndex(int count)
{
try
{
_PageIndex -= count;
int Start = _SectionIndex + _SectionIndex - 1;
if (_PageIndex == Start)
{
ReduceSectionIndex();
}
if (_PageIndex == Start + 4)
{
AddSectionIndex();
}
}
catch
{
throw;
}
}
private void AddSectionIndex()
{
try
{
_SectionIndex += 1;
CreateChildControls();
}
catch
{
throw;
}
}
private void ReduceSectionIndex()
{
try
{
_SectionIndex -= 1;
CreateChildControls();
}
catch
{
throw;
}
}
#endregion
protected override void CreateChildControls()
{
base.CreateChildControls();
try
{
this.Controls.Clear();
//مدیریت دکمه های بعدی، قبلی، اولین و آخرین صفحه
int _Start = 1;
_Start = _SectionIndex + _SectionIndex - 1;
if (_Start > 1)
{
//imgBtnPrevious.Enabled = true;
//imgBtnFirst.Enabled = true;
}
if (_PageIndex < _PageCount)
{
//imgBtnLast.Enabled = true;
//imgBtnNext.Enabled = true;
}
if (_PageIndex > 1)
{
//imgBtnPrevious.Enabled = true;
}
//ایجاد لینک صفحات
if (_PageCount >= _SectionIndex + _SectionIndex - 1)
{
lnkBtn1 = new LinkButton();
lnkBtn1.Text = Convert.ToString(_SectionIndex + _SectionIndex - 1);
lnkBtn1.Click += new EventHandler(OnBtn1Click);
this.Controls.Add(lnkBtn1);
}
if (_PageCount >= _SectionIndex + _SectionIndex)
{
lnkBtn2 = new LinkButton();
lnkBtn2.Text = Convert.ToString(_SectionIndex + _SectionIndex);
lnkBtn2.Click += new EventHandler(OnBtn2Click);
this.Controls.Add(lnkBtn2);
}
if (_PageCount >= _SectionIndex + _SectionIndex + 1)
{
lnkBtn3 = new LinkButton();
lnkBtn3.Text = Convert.ToString(_SectionIndex + _SectionIndex + 1);
lnkBtn3.Click += new EventHandler(OnBtn3Click);
this.Controls.Add(lnkBtn3);
}
if (_PageCount >= _SectionIndex + _SectionIndex + 2)
{
lnkBtn4 = new LinkButton();
lnkBtn4.Text = Convert.ToString(_SectionIndex + _SectionIndex + 2);
lnkBtn4.Click += new EventHandler(OnBtn4Click);
this.Controls.Add(lnkBtn4);
}
if (_PageCount >= _SectionIndex + _SectionIndex + 3)
{
lnkBtn5 = new LinkButton();
lnkBtn5.Text = Convert.ToString(_SectionIndex + _SectionIndex + 3);
lnkBtn5.Click += new EventHandler(OnBtn5Click);
this.Controls.Add(lnkBtn5);
}
}
catch
{
throw;
}
this.ChildControlsCreated = true;
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//Label lblMessage = new Label();
//lblMessage.Text = "صفحه شمار";
//this.Controls.Add(lblMessage);
this.EnsureChildControls();
}
}
}
تا اونجايي كه تونستم توي كد Comment گذاشتم. هرجاش كه مفهوم نبود و توضيح لازم داشت بگيد اضافه كنم