Repeater控件使用心得

    现在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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值