使用Repeater控件开发的心得

原创|其它|编辑:郝浩|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

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP