用于 ASP.NET的分组转发器控件

分享于 

4分钟阅读

Web开发

  繁體 雙語

介绍

你有没有想过为什么 ASP.NET 没有带有可以分组结果的中转控制器? 我做了而且我决定自己写一个。

我已经看到了这个问题的它的他解决方案,但并不像这一样简单而优雅,这就是我决定共享它的原因。

背景

ASP.NET 附带的Repeater 控件有一个非常酷的事件: ItemCreated 事件当添加到控件的Controls 集合中的元素( 或者模板的实例) 时,将激发这里事件。

此外,ASP.NET SDK的源演示展示了如何使用模板和数据绑定。 因为它在网上的许多地方被记录下来,所以我不会在这里重复。 命中 使用'templated ASP.NET',你将看到足够的结果。

解决方案的第三部分包括提供自定义 Comparer 委托的能力,该委托将比较未知类型的2项。

解决办法是什么呢

我所做的是:

  • 创建 System.Web.UI.WebControls.Repeater 类的子类。
  • 捕获 ItemCreated 事件。
  • GroupTemplate 模板添加到控件( 除了 ItemTemplate )。
  • 对于创建的每个项目,使用自定义 Comparer 将它的与前一项。
  • 如果是不同的,实例化模板并使用与当前 Item 相同的ItemData 来对它进行。
  • 重写 CreateChildControls 方法以重置'最后记录'成员。

总之,我认为这是一个非常好的例子子类 ASP.NET 控件,我仍然想知道为什么不包括在标准框架中。

下面是代码。它也包含在演示解决方案文件( 请参见上方) 中。

using System;using System.Web.UI;using System.Web.UI.WebControls;using System.Collections;using System.ComponentModel;namespace GroupedRepeater.Controls
{
 ///<summary>/// Summary description for GroupingRepeater./// When another group is found, render an additional template.///</summary>publicclass GroupingRepeater : System.Web.UI.WebControls.Repeater
 {
 private ITemplate _groupTemplate = null;
 private IComparer _comparer = null;
 privatestaticobject lastvalue = null;
 public GroupingRepeater()
 {
 this.ItemCreated += new 
 RepeaterItemEventHandler(GroupingRepeater_ItemCreated);
 }
 protectedoverridevoid AddParsedSubObject(object obj)
 {
 base.AddParsedSubObject (obj);
 }
 public IComparer Comparer
 {
 get { return _comparer; }
 set { _comparer = value; }
 }
 [TemplateContainer(typeof(GroupHeader))]
 public ITemplate GroupTemplate
 {
 get 
 {
 return _groupTemplate; 
 }
 set 
 {
 _groupTemplate = value; 
 }
 }
 protectedoverridevoid CreateChildControls()
 {
 lastvalue = null;
 base.CreateChildControls ();
 }
 privatevoid GroupingRepeater_ItemCreated(object sender, 
 RepeaterItemEventArgs e)
 {
 System.Diagnostics.Trace.WriteLine(e.Item.GetType().Name);
 if(e.Item.ItemType == ListItemType.Item || 
 e.Item.ItemType == ListItemType.AlternatingItem)
 {
 if(e.Item.DataItem!= null)
 {
 if(_comparer.Compare(lastvalue, e.Item.DataItem)!= 0)
 {
 //add a header if it was different from the previous item. GroupHeader item = new GroupHeader();
 _groupTemplate.InstantiateIn(item);
 item.DataItem = e.Item.DataItem;
 this.Controls.Add(item);
 item.DataBind();
 }
 }
 lastvalue = e.Item.DataItem;
 }
 }
 publicclass GroupHeader : Control,INamingContainer
 {
 privateobject _dataItem;
 publicvirtualobject DataItem 
 {
 get 
 {
 return _dataItem;
 }
 set 
 {
 _dataItem = value;
 }
 }
 }
 }
}

就是这样我希望你能找到有用的东西。


控制  rep  asp  asp-net  Group    
相关文章