现在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的朋友有所帮助:)
---------------------------------
以下是分页源码
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Text;
5using System.Web;
6using System.Web.UI;
7using System.Web.UI.WebControls;
8using System.Security.Permissions;
9using System.Collections;
10
11namespace 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