现在ASP。NET 提供了3个控件来显示数据列表
1.Repeater 2.DataList 3.GridView
这3种控件各有千秋
但是我选择的是Repeater控件,原因嘛 就因为他可以非常灵活的控制HTML输出
这样一来 我们就可以自己写DIV 或者是UL LI等等 可以实现WEB2.0标准网页
Repeater 控件 包括4个常用模版
1. HeaderTemplate
2. ItemTemplate
3. AlterTemplate
4. FooterTemplate
一般来说 不循环的部分 就写在 HeaderTemplate 和FooterTemplate 里面
重点咱们说说ItemTemplate里面的代码写法
<ul>
<li><%# ((Mycs.Model.CategoryInfo)Container.DataItem).Id.ToString() %></li>
</ul>
本人推荐使用这种数据邦定方法 因为 我们如果使用Eval()方法的话 他实际上是使用得反射技术
而反射技术会大量降低程序的执行速度,而且必须传递一个参数 而我们通常是使用得数据表字段
这样一来 就升高了程序的耦合性,而我们如果使用以上的代码的话我们就可以直接使用实体对象来
进行邦定 一举两得 何乐而不为呢? 呵呵
再说DataSource 的邦定
本人推荐使用List<T> 泛型 一是因为这是类型安全的,速度更快 二是里面的对象直接就是实体对象
不用进行多次数据转换。
再说说如何进行分页和排序
分页嘛 我自己写了一个分页控件 里面写了一个委托 , 在绑定数据对象的时候就直接调用这个委托
对数据分页进行封装。
至于排序,我推荐是在实体类里面实现LIST<T>的排序规则。
至于如何做这个可以回帖 或者直接查询MSDN
还有什么问题的话 ,可以在本贴回帖 就写到这里 希望对学习REPEATER的朋友有所帮助:)
---------------------------------
以下是分页源码

Code
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Text;
5
using System.Web;
6
using System.Web.UI;
7
using System.Web.UI.WebControls;
8
using System.Security.Permissions;
9
using System.Collections;
10
11
namespace SideTicket.Biz.Controls
12

{
13
/**//// <summary>
14
/// 基础分页控件
15
/// </summary>
16
[ToolboxData("<{0}:BasePaginationControl runat=server></{0}:BasePaginationControl>")]
17
public class BasePaginationControl : CompositeControl
18
{
19
public delegate void CurrentPageChangedEventHandler(object sender,CurrentPageChangedEventArgs e);
20
public delegate object BoundData();
21
public virtual event CurrentPageChangedEventHandler CurrentPageChanged;
22
private LinkButton _btnDefault;
23
private LinkButton _btnBefore;
24
private LinkButton _btnNext;
25
private LinkButton _btnLast;
26
private DropDownList _ddlPages;
27
分页控件数据项集合#region 分页控件数据项集合
28
/**//// <summary>
29
/// 获取或设置当前页数
30
/// </summary>
31
[Bindable(true)]
32
[Category("Data")]
33
[DefaultValue(1)]
34
[Localizable(true)]
35
public int CurrentPage
36
{
37
get
38
{
39
object obj = ViewState["CurrentPage"];
40
return (obj == null) ? 1 : (System.Int32)ViewState["CurrentPage"];
41
}
42
43
set
44
{
45
ViewState["CurrentPage"] = value;
46
}
47
}
48
/**//// <summary>
49
/// 获取或设置每页数据条数
50
/// </summary>
51
[Bindable(true)]
52
[Category("Data")]
53
[DefaultValue(10)]
54
[Localizable(true)]
55
public int PageSize
56
{
57
get
58
{
59
object obj = ViewState["PageSize"];
60
return (obj == null) ? 10 : (System.Int32)ViewState["PageSize"];
61
}
62
63
set
64
{
65
ViewState["PageSize"] = value;
66
}
67
}
68
/**//// <summary>
69
/// 获取页面数量
70
/// </summary>
71
[Browsable(false)]
72
public int PageCount
73
{
74
get
75
{
76
if (Count < 1 || PageSize < 1 || CurrentPage < 1)
77
{
78
return -1;
79
}
80
else
81
{
82
double pagecount = double.Parse(Count.ToString()) / double.Parse(PageSize.ToString());
83
string pcstr = pagecount.ToString();
84
int pcint = 0;
85
if (pcstr.Contains("."))
86
{
87
string[] pcs = pcstr.Split('.');
88
if (int.Parse(pcs[1][0].ToString()) > 0)
89
pcint = int.Parse(pcs[0]) + 1;
90
else
91
pcint = int.Parse(pcs[0]);
92
}
93
else
94
pcint = int.Parse(pcstr);
95
return ((pagecount < 1.0) ? 1 : pcint);
96
}
97
}
98
}
99
/**//// <summary>
100
/// 获取或设置数据总数
101
/// </summary>
102
[Bindable(true)]
103
[Category("Data")]
104
[DefaultValue(-1)]
105
[Localizable(true)]
106
public int Count
107
{
108
get
109
{
110
object obj = ViewState["Count"];
111
return (obj == null) ? -1 : (System.Int32)ViewState["Count"];
112
}
113
114
set
115
{
116
ViewState["Count"] = value;
117
}
118
}
119
#endregion
120
protected override void CreateChildControls()
121
{
122
_btnDefault = new LinkButton();
123
_btnDefault.ID = "_btnDefault";
124
_btnDefault.Text = "首页";
125
_btnDefault.Command += new CommandEventHandler(btnDefault_Command);
126
Controls.Add(_btnDefault);
127
128
_btnBefore = new LinkButton();
129
_btnBefore.ID = "_btnBefore";
130
_btnBefore.Text = "上一页";
131
_btnBefore.Command += new CommandEventHandler(btnBefore_Command);
132
Controls.Add(_btnBefore);
133
134
_btnNext = new LinkButton();
135
_btnNext.ID = "_btnNext";
136
_btnNext.Text = "下一页";
137
_btnNext.Command += new CommandEventHandler(_btnNext_Command);
138
Controls.Add(_btnNext);
139
140
_btnLast = new LinkButton();
141
_btnLast.ID = "_btnLast";
142
_btnLast.Text = "尾页";
143
_btnLast.Command += new CommandEventHandler(btnLast_Command);
144
Controls.Add(_btnLast);
145
146
_ddlPages = new DropDownList();
147
_ddlPages.DataSource = GetPagesData();
148
_ddlPages.DataTextField = "Text";
149
_ddlPages.DataValueField = "Value";
150
_ddlPages.DataBind();
151
_ddlPages.AutoPostBack = true;
152
_ddlPages.ID = "_ddlPages";
153
_ddlPages.SelectedValue = CurrentPage.ToString();
154
_ddlPages.SelectedIndexChanged += new EventHandler(ddlPages_SelectedIndexChanged);
155
Controls.Add(_ddlPages);
156
}
157
private void btnDefault_Command(object sender, CommandEventArgs e)
158
{
159
this.CurrentPage = 1;
160
OnCurrentPageChanged(new CurrentPageChangedEventArgs(CurrentPage, Count, PageSize));
161
}
162
private void btnBefore_Command(object sender, CommandEventArgs e)
163
{
164
this.CurrentPage -= 1;
165
OnCurrentPageChanged(new CurrentPageChangedEventArgs(CurrentPage, Count, PageSize));
166
}
167
private void _btnNext_Command(object sender, CommandEventArgs e)
168
{
169
this.CurrentPage += 1;
170
OnCurrentPageChanged(new CurrentPageChangedEventArgs(CurrentPage, Count, PageSize));
171
}
172
private void btnLast_Command(object sender, CommandEventArgs e)
173
{
174
this.CurrentPage = PageCount;
175
OnCurrentPageChanged(new CurrentPageChangedEventArgs(CurrentPage, Count, PageSize));
176
}
177
private void ddlPages_SelectedIndexChanged(object sender, EventArgs e)
178
{
179
this.CurrentPage = int.Parse(_ddlPages.SelectedValue);
180
OnCurrentPageChanged(new CurrentPageChangedEventArgs(CurrentPage, Count, PageSize));
181
}
182
protected virtual ArrayList GetPagesData()
183
{
184
ArrayList al = new ArrayList();
185
for (int i = 1; i < PageCount + 1; i++)
186
{
187
string s = i.ToString();
188
al.Add(new ItemObject(s, s));
189
}
190
return al;
191
}
192
protected override void RenderContents(HtmlTextWriter output)
193
{
194
if (CurrentPage == 1)
195
{
196
_btnBefore.Enabled = false;
197
_btnDefault.Enabled = false;
198
_btnLast.Enabled = true;
199
_btnNext.Enabled = true;
200
}
201
else if (CurrentPage == PageCount)
202
{
203
_btnLast.Enabled = false;
204
_btnNext.Enabled = false;
205
_btnBefore.Enabled = true;
206
_btnDefault.Enabled = true;
207
}
208
else
209
{
210
_btnBefore.Enabled = true;
211
_btnDefault.Enabled = true;
212
_btnLast.Enabled = true;
213
_btnNext.Enabled = true;
214
}
215
/**//*
216
* <table>
217
* <tr>
218
* <td></td>
219
* <td></td>
220
* </tr>
221
* </table>
222
*/
223
if (Count > 0 && Count > PageSize)
224
{
225
output.RenderBeginTag(HtmlTextWriterTag.Table);
226
output.RenderBeginTag(HtmlTextWriterTag.Tr);
227
output.RenderBeginTag(HtmlTextWriterTag.Td);
228
output.Write("共有数据" + Count + "条 每页" + PageSize + "条数据 当前为第" + CurrentPage + "页");
229
output.RenderEndTag();
230
output.RenderBeginTag(HtmlTextWriterTag.Td);
231
_btnDefault.RenderControl(output);
232
output.RenderEndTag();
233
output.RenderBeginTag(HtmlTextWriterTag.Td);
234
_btnBefore.RenderControl(output);
235
output.RenderEndTag();
236
237
output.RenderBeginTag(HtmlTextWriterTag.Td);
238
239
output.RenderEndTag();
240
241
output.RenderBeginTag(HtmlTextWriterTag.Td);
242
_btnNext.RenderControl(output);
243
output.RenderEndTag();
244
output.RenderBeginTag(HtmlTextWriterTag.Td);
245
_btnLast.RenderControl(output);
246
output.RenderEndTag();
247
248
output.RenderBeginTag(HtmlTextWriterTag.Td);
249
output.Write(" 转到第");
250
_ddlPages.RenderControl(output);
251
output.Write("页");
252
output.RenderEndTag();
253
254
output.RenderEndTag();
255
output.RenderEndTag();
256
}
257
}
258
protected override bool OnBubbleEvent(object source, EventArgs args)
259
{
260
bool handled = false;
261
CurrentPageChangedEventArgs pageArgs = args as CurrentPageChangedEventArgs;
262
if (pageArgs != null)
263
{
264
OnCurrentPageChanged(pageArgs);
265
handled = true;
266
}
267
return handled;
268
}
269
public void OnCurrentPageChanged(CurrentPageChangedEventArgs e)
270
{
271
EnsureChildControls();
272
_ddlPages.SelectedValue = CurrentPage.ToString();
273
if (CurrentPage == 1)
274
{
275
_btnBefore.Enabled = false;
276
_btnDefault.Enabled = false;
277
_btnLast.Enabled = true;
278
_btnNext.Enabled = true;
279
}
280
else if (CurrentPage == PageCount)
281
{
282
_btnLast.Enabled = false;
283
_btnNext.Enabled = false;
284
_btnBefore.Enabled = true;
285
_btnDefault.Enabled = true;
286
}
287
else
288
{
289
_btnBefore.Enabled = true;
290
_btnDefault.Enabled = true;
291
_btnLast.Enabled = true;
292
_btnNext.Enabled = true;
293
}
294
if (CurrentPageChanged != null)
295
{
296
CurrentPageChanged(this, e);
297
}
298
}
299
public void BoundControlData<T>(BoundData function,Repeater rep)
300
{
301
List<T> list = (List<T>)function.Invoke();
302
if (list != null)
303
{
304
Count = list.Count;
305
if (!Page.IsPostBack)
306
{
307
if (PageSize > list.Count)
308
rep.DataSource = list.GetRange(0, list.Count);
309
else
310
rep.DataSource = list.GetRange(0, PageSize);
311
}
312
else
313
{
314
if ((PageSize * CurrentPage) > list.Count)
315
rep.DataSource = list.GetRange(CurrentPage * PageSize - PageSize, list.Count - ((CurrentPage - 1) * PageSize));
316
else
317
rep.DataSource = list.GetRange(CurrentPage * PageSize - PageSize, PageSize);
318
}
319
rep.DataBind();
320
}
321
}
322
public void BoundControlData<T>(BoundData function, Repeater rep, int currentPage, int pageSize)
323
{
324
this.CurrentPage = currentPage;
325
this.PageSize = pageSize;
326
BoundControlData<T>(function, rep);
327
}
328
}
329
}
330