当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  给Repeater的数据绑定添加智能感知

 给Repeater的数据绑定添加智能感知

点击次数:19 次 发布日期:2008-11-26 22:26:36 作者:源代码网
源代码网推荐      在项目中,Repeater是使用频度比较高的控件, 一方面它结构简单,速度较快, 同时我们也想办法让它工作得更好, 前不久写过关于数据绑定的东西, 使用Eval方法呢,虽然简单,但是性能不怎么好, 可以将数据项转成 DataRowView 或者是强类型的DTO, 但是写起来不够简洁. 今天在研究netTiers 生成的代码的时候,发现了这个有意思的应用,强类型的好处就不用说了,可以在编译时发现拼写错误了,会节省我们不少的时间,同时通过对"Repeater"的扩展我们可以方便地实现一些其它的特性,好了,我们就用一个实例来说明. 在这个示例中,我们需要绑定一个List<Article>的实体集合列表到控件上面, 先看看效果图:
源代码网推荐  
源代码网推荐  在这里,我们只要输入一个Container,后面就会自动出现Article的属性了, 是不是很方便啊,不用Hardcode实体属性了.
源代码网推荐  
源代码网推荐  需要说明的是,这里的ArticleRepeater并不是一个"真正"的Repeater, 它是从Control继承过来的, 因为有时候我们并不需要很多的特性,可以使用这样的简化版的控件 ( 俺对性能的要求是不是太严格了点~~;( ), 还可以借机学习一下控件开发的相关知识. 下面是这个控件的代码:本来还应该有一些设计时的代码内容以方便给那些DragDropCoder,在这里就省略了,“界面在心中”~~~;)
源代码网推荐  using System;
源代码网推荐  using System.Collections.Generic;
源代码网推荐  using System.Text;
源代码网推荐  using System.Web.UI.WebControls;
源代码网推荐  using System.Web.UI;
源代码网推荐  using System.ComponentModel;
源代码网推荐  
源代码网推荐  namespace Demo.Web
源代码网推荐  {
源代码网推荐   [ParseChildren(true)]//这里加这个特性很重要,否则.net将不会识别在前台的模版里面书写的内容.
源代码网推荐   public class AticleRepeater : Control, INamingContainer//我们并没有从Repeater继承出来.
源代码网推荐   {
源代码网推荐   Public properties#region Public properties
源代码网推荐   private int titleDisplayLength = -1;
源代码网推荐   /**//// <summary>
源代码网推荐   /// 多出来的部分将被截断,当然您可以重写该方法,比如添加一个省略号等.
源代码网推荐   /// </summary>
源代码网推荐   public int TitleDisplayLength
源代码网推荐   {
源代码网推荐   get { return titleDisplayLength; }
源代码网推荐   set { titleDisplayLength = value; }
源代码网推荐   }
源代码网推荐  
源代码网推荐   private int hilightCount = -1;
源代码网推荐   /**//// <summary>
源代码网推荐   /// 对前面几条使用不同风格高这显示.
源代码网推荐   /// </summary>
源代码网推荐   public int HilightCount
源代码网推荐   {
源代码网推荐   get { return hilightCount; }
源代码网推荐   set { hilightCount = value; }
源代码网推荐   }
源代码网推荐  
源代码网推荐   private List<Article> dataSource;
源代码网推荐   public List<Article> DataSource
源代码网推荐   {
源代码网推荐   get { return dataSource; }
源代码网推荐   set { dataSource = value; }
源代码网推荐   }
源代码网推荐   #endregion
源代码网推荐  
源代码网推荐   private ITemplate bodyTemplate;
源代码网推荐  
源代码网推荐   public AticleRepeater()
源代码网推荐   {
源代码网推荐   }
源代码网推荐  
源代码网推荐   [Browsable(false)]
源代码网推荐   [TemplateContainer(typeof(ArticleDataItem))]
源代码网推荐   [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
源代码网推荐   public ITemplate MyBodyTemplate//如何申明一个模版.
源代码网推荐   {
源代码网推荐   get { return bodyTemplate; }
源代码网推荐   set { bodyTemplate = value; }
源代码网推荐   }
源代码网推荐  
源代码网推荐   protected override void OnPreRender(EventArgs e)
源代码网推荐   {
源代码网推荐   base.DataBind();//这个也是必须的~~否则不能执行<%# Container.DataItem %> 内容.
源代码网推荐   }
源代码网推荐  
源代码网推荐   protected override void CreateChildControls()
源代码网推荐   {
源代码网推荐   if (ChildControlsCreated)
源代码网推荐   {
源代码网推荐   return;
源代码网推荐   }
源代码网推荐   Controls.Clear();
源代码网推荐  
源代码网推荐   if (bodyTemplate != null)
源代码网推荐   {
源代码网推荐   int indexer = 1;
源代码网推荐   foreach (Article _article in dataSource)
源代码网推荐   {
源代码网推荐   ArticleDataItem item = new ArticleDataItem(_article);
源代码网推荐   if (titleDisplayLength != -1)
源代码网推荐   item.DisplayWordCount = titleDisplayLength;
源代码网推荐  
源代码网推荐   if (hilightCount != -1)
源代码网推荐   {
源代码网推荐   if (indexer <= hilightCount)
源代码网推荐   item.ItemIndex = indexer;
源代码网推荐   else
源代码网推荐   item.ItemIndex = 0;
源代码网推荐   }
源代码网推荐  
源代码网推荐   bodyTemplate.InstantiateIn(item);//填充构造一个可重复项目的模版并输出到控件集合.
源代码网推荐   Controls.Add(item);
源代码网推荐   indexer++;
源代码网推荐   }
源代码网推荐   }
源代码网推荐   ChildControlsCreated = true;//已经创建控件.
源代码网推荐   }
源代码网推荐  
源代码网推荐   public override ControlCollection Controls//不可缺少.
源代码网推荐   {
源代码网推荐   get
源代码网推荐   {
源代码网推荐   this.EnsureChildControls();
源代码网推荐   return base.Controls;
源代码网推荐   }
源代码网推荐   }
源代码网推荐   }
源代码网推荐   /**//// <summary>
源代码网推荐   /// 这个是前台绑定时对实体类的包装, 用于实现一些高级特性, 如标题长度截取等. 您可以自行扩展.
源代码网推荐   /// </summary>
源代码网推荐   [System.ComponentModel.ToolboxItem(false)]
源代码网推荐   public class ArticleDataItem : System.Web.UI.Control, System.Web.UI.INamingContainer
源代码网推荐   {
源代码网推荐   private Article m_article = new Article();
源代码网推荐  
源代码网推荐   public ArticleDataItem(Article article)
源代码网推荐   {
源代码网推荐   this.m_article = article;
源代码网推荐   }
源代码网推荐  
源代码网推荐   [Bindable(true)]//这个特性让我们在前台可以自动感知.
源代码网推荐   public string Title
源代码网推荐   {
源代码网推荐   //如果需要截短标题.
源代码网推荐   get
源代码网推荐   {
源代码网推荐   if (displayWordCount != -1)
源代码网推荐   return m_article.Title.Substring(0, displayWordCount);
源代码网推荐   else
源代码网推荐   return m_article.Title;
源代码网推荐   }
源代码网推荐   }
源代码网推荐  
源代码网推荐   [Bindable(true)]
源代码网推荐   public string AuthorName
源代码网推荐   {
源代码网推荐   get { return m_article.AuthorName; }
源代码网推荐   }
源代码网推荐  
源代码网推荐   [Bindable(true)]
源代码网推荐   public int AuthorID
源代码网推荐   {
源代码网推荐   get { return m_article.AuthorID; }
源代码网推荐   }
源代码网推荐  
源代码网推荐   [Bindable(true)]
源代码网推荐   public int ClickCount
源代码网推荐   {
源代码网推荐   get { return m_article.ClickCount; }
源代码网推荐   }
源代码网推荐  
源代码网推荐   private int displayWordCount = -1;
源代码网推荐   /**//// <summary>
源代码网推荐   /// 显示字数, 超过这个值的将被截断.
源代码网推荐   /// </summary>
源代码网推荐   public int DisplayWordCount
源代码网推荐   {
源代码网推荐   get { return displayWordCount; }
源代码网推荐   set { displayWordCount = value; }
源代码网推荐   }
源代码网推荐  
源代码网推荐   private int itemIndex;
源代码网推荐   /**//// <summary>
源代码网推荐   /// 是第几条数据.
源代码网推荐   /// </summary>
源代码网推荐   public int ItemIndex
源代码网推荐   {
源代码网推荐   get { return itemIndex; }
源代码网推荐   set { itemIndex = value; }
源代码网推荐   }
源代码网推荐   }
源代码网推荐  }
源代码网推荐  
源代码网推荐  在这里我们实现两个扩展功能,一个是截取标题的长度,一个是将前N条高亮显示,可以直接通过属性声明的方式添加即可, 俺在这里抛砖引玉,大家可以发挥创造力添加其它有用的特性。
源代码网推荐  
源代码网推荐  代码里面有比较详细的注释,我就不再做说明. 对于重复性的代码,您可以开发相应的CodeSmith模版来快速成生成.
源代码网推荐  
源代码网推荐  我们再来看一下前台的代码写法都有些什么不同.
源代码网推荐  
源代码网推荐   <h1>
源代码网推荐   下面这种是原始的写法,虽然可以达到效果,但是比较麻烦.</h1>
源代码网推荐   <ul>
源代码网推荐   <asp:Repeater runat="server" ID="rpOrigin">
源代码网推荐   <ItemTemplate>
源代码网推荐   <li>[点击:
源代码网推荐   <%# Eval("ClickCount") %>]
源代码网推荐   <%# GetShortString(Eval("Title").ToString(), 10) %>___Post by
源代码网推荐   <%# Eval("AuthorName") %></li>
源代码网推荐   </ItemTemplate>
源代码网推荐   </asp:Repeater>
源代码网推荐   </ul>
源代码网推荐   <h1>
源代码网推荐   添加了前N条高亮的功能.</h1>
源代码网推荐   <ul>
源代码网推荐   <CnBlogs:AticleRepeater runat="server" ID="rpArticles" HilightCount="3">
源代码网推荐   <%--前面3条高亮--%>
源代码网推荐   <MyBodyTemplate>
源代码网推荐   <li class="list_<%# Container.ItemIndex %>">[点击 :
源代码网推荐   <%# Container.ClickCount %>]
源代码网推荐   <%# Container.Title %>___Post by
源代码网推荐   <%# Container.AuthorName %></li>
源代码网推荐   </MyBodyTemplate>
源代码网推荐   </CnBlogs:AticleRepeater>
源代码网推荐   </ul>
源代码网推荐   <h1>
源代码网推荐   截短标题的列表, 只显示10个字符.
源代码网推荐   </h1>
源代码网推荐   <ul>
源代码网推荐   <CnBlogs:AticleRepeater runat="server" ID="rpArticle2" TitleDisplayLength="10">
源代码网推荐   <%--最多显示10个字符--%>
源代码网推荐   <MyBodyTemplate>
源代码网推荐   <li>[点击 :
源代码网推荐   <%# Container.ClickCount %>]
源代码网推荐   <%# Container.Title %>___Post by
源代码网推荐   <%# Container.AuthorName %></li>
源代码网推荐   </MyBodyTemplate>
源代码网推荐   </CnBlogs:AticleRepeater>
源代码网推荐   </ul>
源代码网推荐  高亮效果图:
源代码网推荐  
源代码网推荐  完整的代码示例请在此处下载, http://www.cnblogs.com/Files/darkangle/DemoSite.rar
源代码网推荐  
源代码网推荐  俺用的是Vs2008 / .net 2.0(在沙加的神舟本上), 使用VS2005的同学重新建一个自己的解决方案将两个工程添进来即可.
源代码网推荐  
源代码网推荐  有人也许会问如果绑定的是DataTable或者DataReader怎么办? 可在包装类里面稍作改造也就是我们这里ArticleDataItem,就留给同学习们自己去研究吧;)
源代码网推荐    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华