ASP.NET数据绑定控件开发浅析

开发 后端
ASP.NET数据绑定控件的内容是什么呢?ASP.NET数据绑定控件是基于模板控件的,那么具体的都有哪些内容呢,让我们看看吧。

本篇将开始介绍如自定义ASP.NET数据绑定控件,这里感谢很多人的支持,有你们的支持很高兴.

这里首先需要大家熟悉ASP.NET模板控件的使用,还有自定义模板控件.因为数据绑定控件多是基于模板控件的.

ASP.NET数据绑定控件一.回顾

如果你使用过ASP.NET内置的数据控件(如DataList,Repeater),你一定会这么做

1.设置数据源 DataSource属性

2.调用数据绑定  DataBind方法

3.在控件的不同模板内使用绑定语法显示数据

这三步应该是必须要做的

其他更多的

你可能需要对绑定的数据进行统一的一些操作(如时间格式化),或者对数据的某一项进行操作(对某一项进行格式化),或者需要触发模板控件内的一些事件(如databound事件).

根据上面的一些需求,我们需要这样做

1.对绑定的数据进行统一的一些操作: 为数据绑定控件定义Item项(表示列表的一条数据, 如Repeater的RepeaterItem)

2.对数据的某一项进行操作: 因为定义了Item项,那你肯定需要一个ItemCollection集合,其可以方便的为你检索数据

3.因为定义了RepeaterItem,原先的EventArgs和CommandEventArgs已经无法满足需求,我们需要自定义委托及其一个为控件提供数据的的ItemEventArgs

上面三点有些并非必须定义,如第2点,还需要根据具体需求来定.但一个完成的控件是需要的.

ASP.NET数据绑定控件二.为数据控件做好准备

这次的demo为不完整的Datalist控件,来源还是MSDN的例子,我们命名为TemplatedList,此控件未定义ItemCollection集合

好了,根据上面的分析我们先为TemplatedList提供项和委托及为事件提供数据的几个EventArgs,请看下面类图

事件类图 

1.TemplatedListCommandEventArgs为Command事件提供数据

2.TemplatedListItemEventArgs为一般项提供数据

3.TemplatedListItem表示TemplatedList的项

ASP.NET数据绑定控件三.编写TemplatedList

1.TemplatedList主要功能简介

提供一个ItemTemplate模板属性,提供三种不同项样式,ItemCommand 事件冒泡事件及4个事件

ItemCommand 事件冒泡事件及4个事件 

2.实现主要步骤

以下为必须

(1)控件必须实现 System.Web.UI.INamingContainer 接口

(2)定义至少一个模板属性

(3)定义DataSource数据源属性

(4)定义控件项DataItem,即模板的一个容器

(5)重写DataBind 方法及复合控件相关方法(模板控件为特殊的复合控件)

当然还有其他额外的属性,样式,事件

3.具体实现

下面我们来具体看实现方法

(1)定义控件成员属性

  1. #region 静态变量  
  2.  
  3.         private static readonly object EventSelectedIndexChanged = new object();  
  4.         private static readonly object EventItemCreated = new object();  
  5.         private static readonly object EventItemDataBound = new object();  
  6.         private static readonly object EventItemCommand = new object();  
  7.         #endregion  
  8.  
  9.         成员变量#region 成员变量  
  10.         private IEnumerable dataSource;  
  11.         private TableItemStyle itemStyle;  
  12.         private TableItemStyle alternatingItemStyle;  
  13.         private TableItemStyle selectedItemStyle;  
  14.         private ITemplate itemTemplate;  
  15.         #endregion  
  16.  
  17.         控件属性#region 控件属性  
  18.  
  19.         [  
  20.         Category("Style"),  
  21.         Description("交替项样式"),  
  22.         DesignerSerializationVisibility(DesignerSerializationVisibility.Content),  
  23.         NotifyParentProperty(true),  
  24.         PersistenceMode(PersistenceMode.InnerProperty),  
  25.         ]  
  26.         public virtual TableItemStyle AlternatingItemStyle  
  27.         {  
  28.             get 
  29.             {  
  30.                 if (alternatingItemStyle == null)  
  31.                 {  
  32.                     alternatingItemStyle = new TableItemStyle();  
  33.                     if (IsTrackingViewState)  
  34.                         ((IStateManager)alternatingItemStyle).TrackViewState();  
  35.                 }  
  36.                 return alternatingItemStyle;  
  37.             }  
  38.         }  
  39.  
  40.  
  41.         [  
  42.         Category("Style"),  
  43.         Description("一般项样式"),  
  44.         DesignerSerializationVisibility(DesignerSerializationVisibility.Content),  
  45.         NotifyParentProperty(true),  
  46.         PersistenceMode(PersistenceMode.InnerProperty),  
  47.         ]  
  48.         public virtual TableItemStyle ItemStyle  
  49.         {  
  50.             get 
  51.             {  
  52.                 if (itemStyle == null)  
  53.                 {  
  54.                     itemStyle = new TableItemStyle();  
  55.                     if (IsTrackingViewState)  
  56.                         ((IStateManager)itemStyle).TrackViewState();  
  57.                 }  
  58.                 return itemStyle;  
  59.             }  
  60.         }  
  61.  
  62.         [  
  63.          Category("Style"),  
  64.          Description("选中项样式"),  
  65.          DesignerSerializationVisibility(DesignerSerializationVisibility.Content),  
  66.          NotifyParentProperty(true),  
  67.          PersistenceMode(PersistenceMode.InnerProperty),  
  68.          ]  
  69.         public virtual TableItemStyle SelectedItemStyle  
  70.         {  
  71.             get 
  72.             {  
  73.                 if (selectedItemStyle == null)  
  74.                 {  
  75.                     selectedItemStyle = new TableItemStyle();  
  76.                     if (IsTrackingViewState)  
  77.                         ((IStateManager)selectedItemStyle).TrackViewState();  
  78.                 }  
  79.                 return selectedItemStyle;  
  80.             }  
  81.         }  
  82.  
  83.  
  84.  
  85.         [  
  86.         Bindable(true),  
  87.         Category("Appearance"),  
  88.         DefaultValue(-1),  
  89.         Description("The cell padding of the rendered table.")  
  90.         ]  
  91.         public virtual int CellPadding  
  92.         {  
  93.             get 
  94.             {  
  95.                 if (ControlStyleCreated == false)  
  96.                 {  
  97.                     return -1;  
  98.                 }  
  99.                 return ((TableStyle)ControlStyle).CellPadding;  
  100.             }  
  101.             set 
  102.             {  
  103.                 ((TableStyle)ControlStyle).CellPadding = value;  
  104.             }  
  105.         }  
  106.  
  107.         [  
  108.         Bindable(true),  
  109.         Category("Appearance"),  
  110.         DefaultValue(0),  
  111.         Description("The cell spacing of the rendered table.")  
  112.         ]  
  113.         public virtual int CellSpacing  
  114.         {  
  115.             get 
  116.             {  
  117.                 if (ControlStyleCreated == false)  
  118.                 {  
  119.                     return 0;  
  120.                 }  
  121.                 return ((TableStyle)ControlStyle).CellSpacing;  
  122.             }  
  123.             set 
  124.             {  
  125.                 ((TableStyle)ControlStyle).CellSpacing = value;  
  126.             }  
  127.         }  
  128.  
  129.  
  130.  
  131.         [  
  132.         Bindable(true),  
  133.         Category("Appearance"),  
  134.         DefaultValue(GridLines.None),  
  135.         Description("The grid lines to be shown in the rendered table.")  
  136.         ]  
  137.         public virtual GridLines GridLines  
  138.         {  
  139.             get 
  140.             {  
  141.                 if (ControlStyleCreated == false)  
  142.                 {  
  143.                     return GridLines.None;  
  144.                 }  
  145.                 return ((TableStyle)ControlStyle).GridLines;  
  146.             }  
  147.             set 
  148.             {  
  149.                 ((TableStyle)ControlStyle).GridLines = value;  
  150.             }  
  151.         }  
  152.  
  153.         [  
  154.         Bindable(true),  
  155.         Category("Data"),  
  156.         DefaultValue(null),  
  157.         Description("数据源"),  
  158.         DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)  
  159.         ]  
  160.         public IEnumerable DataSource  
  161.         {  
  162.             get 
  163.             {  
  164.                 return dataSource;  
  165.             }  
  166.             set 
  167.             {  
  168.                 dataSource = value;  
  169.             }  
  170.         }  
  171.  
  172.  
  173.         [  
  174.         Browsable(false),  
  175.         DefaultValue(null),  
  176.         Description("项模板"),  
  177.         PersistenceMode(PersistenceMode.InnerProperty),  
  178.         TemplateContainer(typeof(TemplatedListItem))  
  179.         ]  
  180.         public virtual ITemplate ItemTemplate  
  181.         {  
  182.             get 
  183.             {  
  184.                 return itemTemplate;  
  185.             }  
  186.             set 
  187.             {  
  188.                 itemTemplate = value;  
  189.             }  
  190.         }  
  191.  
  192.  
  193.         [  
  194.         Bindable(true),  
  195.         DefaultValue(-1),  
  196.         Description("选中项索引,默认为-1")  
  197.         ]  
  198.         public virtual int SelectedIndex  
  199.         {  
  200.             get 
  201.             {  
  202.                 object o = ViewState["SelectedIndex"];  
  203.                 if (o != null)  
  204.                     return (int)o;  
  205.                 return -1;  
  206.             }  
  207.             set 
  208.             {  
  209.                 if (value < -1)  
  210.                 {  
  211.                     throw new ArgumentOutOfRangeException();  
  212.                 }  
  213.                 //获取上次选中项  
  214.                 int oldSelectedIndex = SelectedIndex;  
  215.                 ViewState["SelectedIndex"] = value;  
  216.  
  217.                 if (HasControls())  
  218.                 {  
  219.                     Table table = (Table)Controls[0];  
  220.                     TemplatedListItem item;  
  221.  
  222.                     //第一次选中项不执行  
  223.                     if ((oldSelectedIndex != -1) && (table.Rows.Count > oldSelectedIndex))  
  224.                     {  
  225.                         item = (TemplatedListItem)table.Rows[oldSelectedIndex];  
  226.                         //判断项类型,为了将选中项还原为数据项  
  227.                         if (item.ItemType != ListItemType.EditItem)  
  228.                         {  
  229.                             ListItemType itemType = ListItemType.Item;  
  230.                             if (oldSelectedIndex % 2 != 0)  
  231.                                 itemType = ListItemType.AlternatingItem;  
  232.                             item.SetItemType(itemType);  
  233.                         }  
  234.                     }  
  235.                     //第一次执行此项,并一直执行  
  236.                     if ((value != -1) && (table.Rows.Count > value))  
  237.                     {  
  238.                         item = (TemplatedListItem)table.Rows[value];  
  239.                         item.SetItemType(ListItemType.SelectedItem);  
  240.                     }  
  241.                 }  
  242.             }  
  243.         }  
  244.  
  245.    
  246.         #endregion 

成员如下(可以看上面类图)

1.三个项样式和三个样式属性

2.公开DataSource数据源属性,一个模板属性

3.SelectedIndex索引属性

前面的相信大家都很容易明白,其中的三个项样式我们需要为其重写视图状态管理,不熟悉可以看以前的随笔,这里不再重复.

SelectedIndex属性比较复杂,这里重点介绍此属性

SelectedIndex索引属性默认为-1,

我给出了注释,在赋值前先记录下了上次的选中项,为恢复样式而做准备

  1. //获取上次选中项  
  2.  int oldSelectedIndex = SelectedIndex;  
  3.  ViewState["SelectedIndex"] = value; 

当第一次更改SelectedIndex属性时只执行下列代码(将此项标记为选中项),因为初始化时的没有oldSelectedIndex,不需要恢复样式

  1. //第一次执行此项,并一直执行  
  2.                     if ((value != -1) && (table.Rows.Count > value))  
  3.                     {  
  4.                         item = (TemplatedListItem)table.Rows[value];  
  5.                         item.SetItemType(ListItemType.SelectedItem);  
  6.                     } 

再次执行时,恢复oldSelectedIndex选中项样式

  1. //第一次选中项不执行  
  2. if ((oldSelectedIndex != -1) && (table.Rows.Count > oldSelectedIndex))  
  3. {  
  4.     item = (TemplatedListItem)table.Rows[oldSelectedIndex];  
  5.     //判断项类型,为了将选中项还原为数据项  
  6.     if (item.ItemType != ListItemType.EditItem)  
  7.     {  
  8.         ListItemType itemType = ListItemType.Item;  
  9.         if (oldSelectedIndex % 2 != 0)  
  10.             itemType = ListItemType.AlternatingItem;  
  11.         item.SetItemType(itemType);  
  12.     }  

相信这样的解释你会明白

(2)定义控件成员事件

我们可以用上刚才我们声明的委托了,即然你定义了这么多事件,就该为其安排触发的先后.所以这个要特别注意,等下会再次提到.

  1. #region 事件  
  2.         protected virtual void OnItemCommand(TemplatedListCommandEventArgs e)  
  3.         {  
  4.             TemplatedListCommandEventHandler onItemCommandHandler = (TemplatedListCommandEventHandler)Events[EventItemCommand];  
  5.             if (onItemCommandHandler != null) onItemCommandHandler(this, e);  
  6.         }  
  7.  
  8.         protected virtual void OnItemCreated(TemplatedListItemEventArgs e)  
  9.         {  
  10.             TemplatedListItemEventHandler onItemCreatedHandler = (TemplatedListItemEventHandler)Events[EventItemCreated];  
  11.             if (onItemCreatedHandler != null) onItemCreatedHandler(this, e);  
  12.         }  
  13.  
  14.         protected virtual void OnItemDataBound(TemplatedListItemEventArgs e)  
  15.         {  
  16.             TemplatedListItemEventHandler onItemDataBoundHandler = (TemplatedListItemEventHandler)Events[EventItemDataBound];  
  17.             if (onItemDataBoundHandler != null) onItemDataBoundHandler(this, e);  
  18.         }  
  19.  
  20.         protected virtual void OnSelectedIndexChanged(EventArgs e)  
  21.         {  
  22.             EventHandler handler = (EventHandler)Events[EventSelectedIndexChanged];  
  23.             if (handler != null) handler(this, e);  
  24.         }  
  25.  
  26.         [  
  27.         Category("Action"),  
  28.         Description("Raised when a CommandEvent occurs within an item.")  
  29.         ]  
  30.         public event TemplatedListCommandEventHandler ItemCommand  
  31.         {  
  32.             add  
  33.             {  
  34.                 Events.AddHandler(EventItemCommand, value);  
  35.             }  
  36.             remove  
  37.             {  
  38.                 Events.RemoveHandler(EventItemCommand, value);  
  39.             }  
  40.         }  
  41.  
  42.         [  
  43.         Category("Behavior"),  
  44.         Description("Raised when an item is created and is ready for customization.")  
  45.         ]  
  46.         public event TemplatedListItemEventHandler ItemCreated  
  47.         {  
  48.             add  
  49.             {  
  50.                 Events.AddHandler(EventItemCreated, value);  
  51.             }  
  52.             remove  
  53.             {  
  54.                 Events.RemoveHandler(EventItemCreated, value);  
  55.             }  
  56.         }  
  57.  
  58.         [  
  59.         Category("Behavior"),  
  60.         Description("Raised when an item is data-bound.")  
  61.         ]  
  62.         public event TemplatedListItemEventHandler ItemDataBound  
  63.         {  
  64.             add  
  65.             {  
  66.                 Events.AddHandler(EventItemDataBound, value);  
  67.             }  
  68.             remove  
  69.             {  
  70.                 Events.RemoveHandler(EventItemDataBound, value);  
  71.             }  
  72.         }  
  73.  
  74.         [  
  75.         Category("Action"),  
  76.         Description("Raised when the SelectedIndex property has changed.")  
  77.         ]  
  78.         public event EventHandler SelectedIndexChanged  
  79.         {  
  80.             add  
  81.             {  
  82.                 Events.AddHandler(EventSelectedIndexChanged, value);  
  83.             }  
  84.             remove  
  85.             {  
  86.                 Events.RemoveHandler(EventSelectedIndexChanged, value);  
  87.             }  
  88.         }  
  89.         #endregion 

(3)关键实现

我们为控件提供了这么多东西,剩下的事情就是要真正去实现功能了

1.重写DataBind方法

当控件绑定数据时首先会执行此方法触发DataBinding事件

  1. //控件执行绑定时执行  
  2. public override void DataBind()  
  3. {  
  4.  
  5.     base.OnDataBinding(EventArgs.Empty);  
  6.  
  7.     //移除控件  
  8.     Controls.Clear();  
  9.     //清除视图状态信息  
  10.     ClearChildViewState();  
  11.  
  12.     //创建一个带或不带指定数据源的控件层次结构  
  13.     CreateControlHierarchy(true);  
  14.     ChildControlsCreated = true;  
  15.  
  16.     TrackViewState();  

2.CreateControlHierarchy方法

  1. /**//// <summary>  
  2.  /// 创建一个带或不带指定数据源的控件层次结构  
  3.  /// </summary>  
  4.  /// <param name="useDataSource">指示是否要使用指定的数据源</param>  
  5.  //注意:当第二次执行数据绑定时,会执行两遍  
  6.  private void CreateControlHierarchy(bool useDataSource)  
  7.  {  
  8.      IEnumerable dataSource = null;  
  9.      int count = -1;  
  10.  
  11.  
  12.      if (useDataSource == false)  
  13.      {  
  14.          // ViewState must have a non-null value for ItemCount because this is checked   
  15.          //  by CreateChildControls.  
  16.          count = (int)ViewState["ItemCount"];  
  17.          if (count != -1)  
  18.          {  
  19.              dataSource = new DummyDataSource(count);  
  20.          }  
  21.      }  
  22.      else 
  23.      {  
  24.          dataSource = this.dataSource;  
  25.      }  
  26.  
  27.      //根据项类型开始创建子控件  
  28.      if (dataSource != null)  
  29.      {  
  30.          Table table = new Table();  
  31.          Controls.Add(table);  
  32.  
  33.          //选中项索引  
  34.          int selectedItemIndex = SelectedIndex;  
  35.          //项索引  
  36.          int index = 0;  
  37.          //项数量  
  38.          count = 0;  
  39.          foreach (object dataItem in dataSource)  
  40.          {  
  41.  
  42.              ListItemType itemType = ListItemType.Item;  
  43.              if (index == selectedItemIndex)  
  44.              {  
  45.                   
  46.                  itemType = ListItemType.SelectedItem;  
  47.              }  
  48.              else if (index % 2 != 0)  
  49.              {  
  50.                  itemType = ListItemType.AlternatingItem;  
  51.              }  
  52.  
  53.              //根据不同项索引创建样式  
  54.              CreateItem(table, index, itemType, useDataSource, dataItem);  
  55.              count++;  
  56.              index++;  
  57.          }  
  58.      }  
  59.      //执行绑定时执行时执行  
  60.      if (useDataSource)  
  61.      {  
  62.          //保存项数量  
  63.          ViewState["ItemCount"] = ((dataSource != null) ? count : -1);  
  64.      }  
  65.  }  
  66.  
  67.  
  68.  //创建项  
  69.  private TemplatedListItem CreateItem(Table table, int itemIndex, ListItemType itemType, bool dataBind, object dataItem)  
  70.  {  
  71.      TemplatedListItem item = new TemplatedListItem(itemIndex, itemType);  
  72.      TemplatedListItemEventArgs e = new TemplatedListItemEventArgs(item);  
  73.  
  74.      if (itemTemplate != null)  
  75.      {  
  76.          itemTemplate.InstantiateIn(item.Cells[0]);  
  77.      }  
  78.      if (dataBind)  
  79.      {  
  80.          item.DataItem = dataItem;  
  81.      }  
  82.      //注意事件触发顺序  
  83.      OnItemCreated(e);  
  84.      table.Rows.Add(item);  
  85.  
  86.      if (dataBind)  
  87.      {  
  88.          item.DataBind();  
  89.          OnItemDataBound(e);  
  90.  
  91.          item.DataItem = null;  
  92.      }  
  93.  
  94.      return item;  
  95.  } 

CreateItem方法辅助用于创建项模板,此处注意事件触发顺序,上面已经提到过

此方法根据项索引创建控件中不同的Item项 ,ViewState["ItemCount"]表示项的数量,第一次触发时或者重新执行DataBind方法时方法参数为true,并在初始化以后(回发期间)CreateChildControls方法会调用此方法,其参数为false

数据源不再是实际的数据源,而是新定义的DummyDataSource,其主要实现了一个迭代

  1. internal sealed class DummyDataSource : ICollection  
  2.     {  
  3.  
  4.         private int dataItemCount;  
  5.  
  6.         public DummyDataSource(int dataItemCount)  
  7.         {  
  8.             this.dataItemCount = dataItemCount;  
  9.         }  
  10.  
  11.         public int Count  
  12.         {  
  13.             get 
  14.             {  
  15.                 return dataItemCount;  
  16.             }  
  17.         }  
  18.  
  19.         public bool IsReadOnly  
  20.         {  
  21.             get 
  22.             {  
  23.                 return false;  
  24.             }  
  25.         }  
  26.  
  27.         public bool IsSynchronized  
  28.         {  
  29.             get 
  30.             {  
  31.                 return false;  
  32.             }  
  33.         }  
  34.  
  35.         public object SyncRoot  
  36.         {  
  37.             get 
  38.             {  
  39.                 return this;  
  40.             }  
  41.         }  
  42.  
  43.         public void CopyTo(Array array, int index)  
  44.         {  
  45.             for (IEnumerator e = this.GetEnumerator(); e.MoveNext(); )  
  46.                 array.SetValue(e.Current, index++);  
  47.         }  
  48.  
  49.         public IEnumerator GetEnumerator()  
  50.         {  
  51.             return new DummyDataSourceEnumerator(dataItemCount);  
  52.         }  
  53.  
  54.         private class DummyDataSourceEnumerator : IEnumerator  
  55.         {  
  56.  
  57.             private int count;  
  58.             private int index;  
  59.  
  60.             public DummyDataSourceEnumerator(int count)  
  61.             {  
  62.                 this.count = count;  
  63.                 this.index = -1;  
  64.             }  
  65.  
  66.             public object Current  
  67.             {  
  68.                 get 
  69.                 {  
  70.                     return null;  
  71.                 }  
  72.             }  
  73.  
  74.             public bool MoveNext()  
  75.             {  
  76.                 index++;  
  77.                 return index < count;  
  78.             }  
  79.  
  80.             public void Reset()  
  81.             {  
  82.                 this.index = -1;  
  83.             }  
  84.         }  
  85.     } 

原因很明显,为了减少对数据源的访问,所以我们平时操作数据的时候,必须重新执行DataBind方法,原因就在此

好了,到了这里差不多主要的事情我们已经完成.接着把剩下的也完成

3.呈现

又到了Render方法这里了

此方法体只要执行了PrepareControlHierarchy方法,不同的方法做不同的事情,CreateControlHierarchy方法根据索引值指定了不同的项,PrepareControlHierarchy则为不同项呈现不同的样式效果

  1. //为不同类型项加载样式  
  2. private void PrepareControlHierarchy()  
  3. {  
  4.     if (HasControls() == false)  
  5.     {  
  6.         return;  
  7.     }  
  8.  
  9.     Debug.Assert(Controls[0] is Table);  
  10.     Table table = (Table)Controls[0];  
  11.  
  12.     table.CopyBaseAttributes(this);  
  13.     if (ControlStyleCreated)  
  14.     {  
  15.         table.ApplyStyle(ControlStyle);  
  16.     }  
  17.  
  18.     // The composite alternating item style; do just one  
  19.     // merge style on the actual item.  
  20.     Style altItemStyle = null;  
  21.     if (alternatingItemStyle != null)  
  22.     {  
  23.         altItemStyle = new TableItemStyle();  
  24.         altItemStyle.CopyFrom(itemStyle);  
  25.         altItemStyle.CopyFrom(alternatingItemStyle);  
  26.     }  
  27.     else 
  28.     {  
  29.         altItemStyle = itemStyle;  
  30.     }  
  31.  
  32.     int rowCount = table.Rows.Count;  
  33.     for (int i = 0; i < rowCount; i++)  
  34.     {  
  35.         TemplatedListItem item = (TemplatedListItem)table.Rows[i];  
  36.         Style compositeStyle = null;  
  37.         //根据不同项加载不同样式  
  38.         switch (item.ItemType)  
  39.         {  
  40.             case ListItemType.Item:  
  41.                 compositeStyle = itemStyle;  
  42.                 break;  
  43.  
  44.             case ListItemType.AlternatingItem:  
  45.                 compositeStyle = altItemStyle;  
  46.                 break;  
  47.  
  48.             case ListItemType.SelectedItem:  
  49.                 {  
  50.                     compositeStyle = new TableItemStyle();  
  51.  
  52.                     if (item.ItemIndex % 2 != 0)  
  53.                         compositeStyle.CopyFrom(altItemStyle);  
  54.                     else 
  55.                         compositeStyle.CopyFrom(itemStyle);  
  56.                     compositeStyle.CopyFrom(selectedItemStyle);  
  57.                 }  
  58.                 break;  
  59.         }  
  60.  
  61.         if (compositeStyle != null)  
  62.         {  
  63.             item.MergeStyle(compositeStyle);  
  64.         }  
  65.     }  
  66. }  
  67.  
  68. //控件呈现  
  69. protected override void Render(HtmlTextWriter writer)  
  70. {  
  71.     // Apply styles to the control hierarchy  
  72.     // and then render it out.  
  73.  
  74.     // Apply styles during render phase, so the user can change styles  
  75.     // after calling DataBind without the property changes ending  
  76.     // up in view state.  
  77.     PrepareControlHierarchy();  
  78.  
  79.     RenderContents(writer);  

终于差不多了,经过这么多步骤,我们终于完成了,让我们来使用控件,看一下效果

使用控件效果 

又完成一个并不完美的控件,本来还该继续下去的,怕篇幅太大,到这里还没结束,只是刚开始,下次我们继续

ASP.NET数据绑定控件的基本情况就向你介绍到这里,希望对你了解ASP.NET数据绑定控件有所帮助。

【编辑推荐】

  1. ASP.NET控件开发基础之为子控件添加样式
  2. ASP.NET控件开发基础之服务器控件客户端功能
  3. ASP.NET控件开发之控件生成器浅析
  4. ASP.NET控件开发基础的总结详解
  5. ASP.NET模板控件开发浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-03 18:15:05

ASP.NET数据绑定

2009-08-07 15:24:16

ASP.NET模板控件

2009-07-27 17:25:53

ASP.NET验证控件

2009-08-06 18:18:27

ASP.NET控件开发ASP.NET复合控件

2009-08-04 15:20:59

ASP.NET数据验证数据验证控件

2009-08-06 15:21:45

ASP.NET控件开发RenderConte

2009-07-31 18:12:58

ASP.NET数据绑定

2009-07-28 09:32:41

ASP.NET自定义控

2009-08-05 17:43:48

ASP.NET 2.0

2009-08-07 15:45:26

ASP.NET复合控件数据绑定

2009-08-07 14:05:21

ASP.NET控件

2009-08-07 17:49:44

控件设计器

2009-08-07 17:41:07

ASP.NET Web

2009-11-26 09:02:59

ASP.NET数据控件

2009-08-05 18:46:21

ComboBox显示ASP.NET控件开发

2009-08-06 13:08:23

ASP.NET控件开发

2009-08-06 09:18:01

ASP.NET自定义控ASP.NET控件开发

2009-08-04 17:41:10

ASP.NET数据验证

2009-08-05 18:32:28

HtmlTextWriASP.NET控件开发

2009-08-06 18:32:00

ASP.NET控件开发ASP.NET复合控件
点赞
收藏

51CTO技术栈公众号