原创|其它|编辑:郝浩|2009-02-25 02:26:45.000|阅读 638 次
概述:Repeater控件,原因嘛就因为他可以非常灵活的控制HTML输出,这样一来 我们就可以自己写DIV 或者是UL LI等等 可以实现WEB2.0标准网页.
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
现在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
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园