ASP.NET控件开发基础(18)

http://tech.ddvip.com   2007年09月02日    社区交流

内容摘要:本篇继续上篇的讨论,可能大家已经在使用asp.net2.0了,DataSource属性不再使用,而是跟数据源控件搭配使用.现在讨论的绑定技术都是基于1.1版本,先熟悉一下,本质上是一样的,这样一步步的学习.对以后绝对有帮助.因为当你使用数据源控件,只需要设置一个DataSourceID,方便的同时你是否知道数据源控件帮你做了什么事情,如果你想觉的够用了,可以不用了解,但我相信你一定会有需求.

  主要的变化在于DataSource,类型更改为object其对传入的数据源进行判断,另外还加入了DataMember属性

  (2)关键实现

  1.因为Repeater模板不具有样式属性,所以去掉了PrepareControlHierarchy方法,

  2.由于不涉及到复杂的样式属性,所以不必重载视图状态管理的三个方法

  这两点就可以让控件减少很多代码的编写

  3.CreateControlHierarchy方法和CreateItem方法

  Repeater模板的实现方法和TemplatedList稍有不同,但变化不大,应该容易理解.看下面代码

    /**//// <summary>
    /// 创建控件各种项
    /// </summary>
    /// <param name="itemIndex"></param>
    /// <param name="itemType"></param>
    /// <param name="dataBind"></param>
    /// <param name="dataItem"></param>
    /// <returns></returns>
    private RepeaterItem CreateItem(int itemIndex, ListItemType itemType, bool dataBind, object dataItem)
    {
      ITemplate selectedTemplate;
      //根据不同类型创建不同项
      switch (itemType)
      {
        case ListItemType.Header:
          selectedTemplate = headerTemplate;
          break;
        case ListItemType.Item:
          selectedTemplate = itemTemplate;
          break;
        case ListItemType.AlternatingItem:
          selectedTemplate = alternatingItemTemplate;
          break;
        case ListItemType.Separator:
          selectedTemplate = separatorTemplate;
          break;
        case ListItemType.Footer:
          selectedTemplate = footerTemplate;
          break;
        default:
          selectedTemplate = null;
          break;
      }
  
      if ((itemType == ListItemType.AlternatingItem) &&
        (alternatingItemTemplate == null))
      {
        selectedTemplate = itemTemplate;
        itemType = ListItemType.Item;
      }
  
      RepeaterItem item = new RepeaterItem(itemIndex, itemType, dataItem);
  
      if (selectedTemplate != null)
      {
        selectedTemplate.InstantiateIn(item);
      }
  
      OnItemCreated(new RepeaterItemEventArgs(item));
  
      Controls.Add(item);
  
      if (dataBind)
      {
        item.DataBind();
        OnItemDataBound(new RepeaterItemEventArgs(item));
      }
      return item;
    }
  
    private ArrayList items = null;
    private void CreateControlHierarchy(bool useDataSource)
    {
      items = new ArrayList();
      IEnumerable ds = null;
  
      if (HeaderTemplate != null)
      {
        RepeaterItem header = CreateItem(-1, ListItemType.Header, false, null);
      }
  
      int count = -1;
      if (useDataSource)
      {
        //解析DataSource
        ds = (IEnumerable)DataSourceHelper.ResolveDataSource(DataSource,
          DataMember);
      }
      else
      {
        count = (int)ViewState["ItemCount"];
        if (count != -1)
        {
          ds = new DummyDataSource(count);
        }
      }
  
      if (ds != null)
      {
        int index = 0;
        count = 0;
        RepeaterItem item;
        ListItemType itemType = ListItemType.Item;
  
        foreach (object dataItem in (IEnumerable)ds)
        {
          if (index != 0)
          {
            RepeaterItem separator = CreateItem(-1, ListItemType.Separator, false, null);
          }
  
          item = CreateItem(index, itemType, useDataSource, dataItem);
          items.Add(item);
          index++;
          count++;
  
          if (itemType == ListItemType.Item)
            itemType = ListItemType.AlternatingItem;
          else
            itemType = ListItemType.Item;
        }
      }
  
      if (FooterTemplate != null)
      {
        RepeaterItem footer = CreateItem(-1, ListItemType.Footer, false, null);
      }
  
      if (useDataSource)
      {
        ViewState["ItemCount"] = ((ds != null) ? count : -1);
      }
    }

责编:豆豆技术应用

正在加载评论...