public
class
DefaultPagerLayout:ITemplate
{
private
ImageButton Next;
private
ImageButton First;
private
ImageButton Last;
private
ImageButton Previous;
private
Panel Pager;
public
DefaultPagerLayout()
{
Next
=
new
ImageButton();
First
=
new
ImageButton();
Last
=
new
ImageButton();
Previous
=
new
ImageButton();
Pager
=
new
Panel();
Next.ID
=
"
Next
"
; Next.AlternateText
=
"
下一页
"
;Next.ImageUrl
=
"
play2.gif
"
;
First.ID
=
"
First
"
; First.AlternateText
=
"
首页
"
;First.ImageUrl
=
"
play2L_dis.gif
"
;
Last.ID
=
"
Last
"
; Last.AlternateText
=
"
末页
"
;Last.ImageUrl
=
"
play2_dis.gif
"
;
Previous.ID
=
"
Previous
"
; Previous.AlternateText
=
"
上一页
"
;Previous.ImageUrl
=
"
play2L.gif
"
;
Pager.ID
=
"
Pager
"
;
}
public
void
InstantiateIn(Control control)
{
control.Controls.Clear();
Table table
=
new
Table();
table.BorderWidth
=
Unit.Pixel(
0
);
table.CellSpacing
=
1
;
table.CellPadding
=
0
;
TableRow row
=
new
TableRow();
row.VerticalAlign
=
VerticalAlign.Top;
table.Rows.Add(row);
TableCell cell
=
new
TableCell();
cell.HorizontalAlign
=
HorizontalAlign.Right;
cell.VerticalAlign
=
VerticalAlign.Middle;
cell.Controls.Add(First);
cell.Controls.Add(Previous);
row.Cells.Add(cell);
cell
=
new
TableCell();
cell.HorizontalAlign
=
HorizontalAlign.Center;
cell.Controls.Add(Pager);
row.Cells.Add(cell);
cell
=
new
TableCell();
cell.VerticalAlign
=
VerticalAlign.Middle;
cell.Controls.Add(Next);
cell.Controls.Add(Last);
row.Cells.Add(cell);
control.Controls.Add(table);
}
}
class
DefaultPagerLayout:ITemplate
{
private
ImageButton Next;
private
ImageButton First;
private
ImageButton Last;
private
ImageButton Previous;
private
Panel Pager;
public
DefaultPagerLayout()
{
Next
=
new
ImageButton();
First
=
new
ImageButton();
Last
=
new
ImageButton();
Previous
=
new
ImageButton();
Pager
=
new
Panel();
Next.ID
=
"
Next
"
; Next.AlternateText
=
"
下一页
"
;Next.ImageUrl
=
"
play2.gif
"
;
First.ID
=
"
First
"
; First.AlternateText
=
"
首页
"
;First.ImageUrl
=
"
play2L_dis.gif
"
;
Last.ID
=
"
Last
"
; Last.AlternateText
=
"
末页
"
;Last.ImageUrl
=
"
play2_dis.gif
"
;
Previous.ID
=
"
Previous
"
; Previous.AlternateText
=
"
上一页
"
;Previous.ImageUrl
=
"
play2L.gif
"
;
Pager.ID
=
"
Pager
"
;
}
public
void
InstantiateIn(Control control)
{
control.Controls.Clear();
Table table
=
new
Table();
table.BorderWidth
=
Unit.Pixel(
0
);
table.CellSpacing
=
1
;
table.CellPadding
=
0
;
TableRow row
=
new
TableRow();
row.VerticalAlign
=
VerticalAlign.Top;
table.Rows.Add(row);
TableCell cell
=
new
TableCell();
cell.HorizontalAlign
=
HorizontalAlign.Right;
cell.VerticalAlign
=
VerticalAlign.Middle;
cell.Controls.Add(First);
cell.Controls.Add(Previous);
row.Cells.Add(cell);
cell
=
new
TableCell();
cell.HorizontalAlign
=
HorizontalAlign.Center;
cell.Controls.Add(Pager);
row.Cells.Add(cell);
cell
=
new
TableCell();
cell.VerticalAlign
=
VerticalAlign.Middle;
cell.Controls.Add(Next);
cell.Controls.Add(Last);
row.Cells.Add(cell);
control.Controls.Add(table);
}
}
DefaultPagerLayout通过编程的方式提供了所有的导航元素,并将它们加入到aspx页面,不过这一次导航元素用标准的HTML表格设置了格式。现在,如果用户没有提供一个表现模板,程序将自动提供一个默认的模板。
[TemplateContainer(
typeof
(LayoutContainer))]
public
ITemplate Layout
{
get
{
return
(_layout
==
null
)
?
new
DefaultPagerLayout():_layout;}
set
{_layout
=
value;}
}
下面再来看看生成各个页面编号的过程。分页控件首先需要确定一些属性值,通过这些属性值来确定要生成多少不同的页面编号。
public
int
CurrentPage
{
get
{
string
cur
=
(
string
)ViewState[
"
CurrentPage
"
];
return
(cur
==
string
.Empty
||
cur
==
null
)
?
1
:
int
.Parse(cur);
}
set
{
ViewState[
"
CurrentPage
"
]
=
value.ToString();}
}
public
int
PagersToShow
{
get
{
return
_results;}
set
{_results
=
value;}
}
public
int
ResultsToShow
{
get
{
return
_resultsperpage;}
set
{_resultsperpage
=
value;}
}
int
CurrentPage
{
get
{
string
cur
=
(
string
)ViewState[
"
CurrentPage
"
];
return
(cur
==
string
.Empty
||
cur
==
null
)
?
1
:
int
.Parse(cur);
}
set
{
ViewState[
"
CurrentPage
"
]
=
value.ToString();}
}
public
int
PagersToShow
{
get
{
return
_results;}
set
{_results
=
value;}
}
public
int
ResultsToShow
{
get
{
return
_resultsperpage;}
set
{_resultsperpage
=
value;}
}
CurrentPage保存的实际上是页面编号的ViewState中的当前页面,PagersToShow方法定义的属性允许用户指定要显示多少页面,而ResultsToShow定义的属性则允许用户指定每页要显示多少记录,默认值是10。
NumberofPagersToGenerate返回当前应当生成的页面编号的数量。
private
int
PagerSequence
{
get
{
return
Convert.ToInt32
(Math.Ceiling((
double
)CurrentPage
/
(
double
)PagersToShow));}
}
private
int
NumberOfPagersToGenerate
{
get
{
return
PagerSequence
*
PagersToShow;}
}
private
int
TotalPagesToShow
{
get
{
return
Convert.ToInt32(Math.Ceiling((
double
)TotalResults
/
(
double
)_resultsperpage));}
}
public
int
TotalResults
{
get
{
return
_builder.Adapter.TotalCount;}
}
int
PagerSequence
{
get
{
return
Convert.ToInt32
(Math.Ceiling((
double
)CurrentPage
/
(
double
)PagersToShow));}
}
private
int
NumberOfPagersToGenerate
{
get
{
return
PagerSequence
*
PagersToShow;}
}
private
int
TotalPagesToShow
{
get
{
return
Convert.ToInt32(Math.Ceiling((
double
)TotalResults
/
(
double
)_resultsperpage));}
}
public
int
TotalResults
{
get
{
return
_builder.Adapter.TotalCount;}
}
TotalPagesToShow方法返回要显示的总页面数量,由用户预设的ResultsToShow属性调整。
虽然ASP.NET定义了一些默认的样式,不过对于分页控件的用户它们可能不是很实用。用户可以通过自定义样式来调整分页控件的外观。
public
Style UnSelectedPagerStyle
{
get
{
return
UnselectedPager;}
}
public
Style SelectedPagerStyle
{
get
{
return
SelectedPager;}
}
Style UnSelectedPagerStyle
{
get
{
return
UnselectedPager;}
}
public
Style SelectedPagerStyle
{
get
{
return
SelectedPager;}
}
UnSelectedPagerStyle提供了页面编号未选中时所用的样式,而SelectedPagerStyle提供了页面编号被选中时所用的样式。
private
void
GeneratePagers(WebControl control)
{
control.Controls.Clear();
int
pager
=
(PagerSequence
-
1
)
*
PagersToShow
+
1
;
for
(;pager<
=
NumberOfPagersToGenerate
&&
pager<
=
TotalPagesToShow;pager
++
)
{
LinkButton link
=
new
LinkButton();
link.Text
=
pager.ToString();
link.ID
=
pager.ToString();
link.Click
+=
new
EventHandler(
this
.Pager_Click);
if
(link.ID.Equals(CurrentPage.ToString()))
link.MergeStyle(SelectedPagerStyle);
else
link.MergeStyle(UnSelectedPagerStyle);
control.Controls.Add(link);
control.Controls.Add(
new
LiteralControl(
"
"
));
}
}
private
void
GeneratePagers()
{
GeneratePagers(Holder);
}
void
GeneratePagers(WebControl control)
{
control.Controls.Clear();
int
pager
=
(PagerSequence
-
1
)
*
PagersToShow
+
1
;
for
(;pager<
=
NumberOfPagersToGenerate
&&
pager<
=
TotalPagesToShow;pager
++
)
{
LinkButton link
=
new
LinkButton();
link.Text
=
pager.ToString();
link.ID
=
pager.ToString();
link.Click
+=
new
EventHandler(
this
.Pager_Click);
if
(link.ID.Equals(CurrentPage.ToString()))
link.MergeStyle(SelectedPagerStyle);
else
link.MergeStyle(UnSelectedPagerStyle);
control.Controls.Add(link);
control.Controls.Add(
new
LiteralControl(
"
"
));
}
}
private
void
GeneratePagers()
{
GeneratePagers(Holder);
}
GeneratePagers方法动态地创建所有页面编号,页面编号是LinkButton类型的按钮。各个页面编号的标签和ID属性通过循环赋值,同 时,点击事件被绑定到适当的事件句柄。最后,页面编号被加入到一个容器控件——在本例中是一个Panel对象。按钮ID起到了标识哪一个按钮触发点击事件 的作用。下面是事件句柄的定义:
private
void
Pager_Click(
object
sender, System.EventArgs e)
{
LinkButton button
=
(LinkButton) sender;
CurrentPage
=
int
.Parse(button.ID);
RaiseEvent(PageChanged,
this
,
new
PageChangedEventArgs(CurrentPage,PagedEventInvoker.Pager));
Update();
}
private
void
Next_Click(
object
sender, System.Web.UI.ImageClickEventArgs e)
{
if
(CurrentPage<TotalPagesToShow)
CurrentPage
++
;
RaiseEvent(PageChanged,
this
,
new
PageChangedEventArgs(CurrentPage,PagedEventInvoker.Next));
Update();
}
private
void
Previous_Click(
object
sender, System.Web.UI.ImageClickEventArgs e)
void
Pager_Click(
object
sender, System.EventArgs e)
{
LinkButton button
=
(LinkButton) sender;
CurrentPage
=
int
.Parse(button.ID);
RaiseEvent(PageChanged,
this
,
new
PageChangedEventArgs(CurrentPage,PagedEventInvoker.Pager));
Update();
}
private
void
Next_Click(
object
sender, System.Web.UI.ImageClickEventArgs e)
{
if
(CurrentPage<TotalPagesToShow)
CurrentPage
++
;
RaiseEvent(PageChanged,
this
,
new
PageChangedEventArgs(CurrentPage,PagedEventInvoker.Next));
Update();
}
private
void
Previous_Click(
object
sender, System.Web.UI.ImageClickEventArgs e)