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

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

内容摘要:ASP.NET控件开发基础

  (3)关键实现

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

  1.重写DataBind方法

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

    //控件执行绑定时执行
    public override void DataBind()
    {
  
      base.OnDataBinding(EventArgs.Empty);
  
      //移除控件
      Controls.Clear();
      //清除视图状态信息
      ClearChildViewState();
  
      //创建一个带或不带指定数据源的控件层次结构
      CreateControlHierarchy(true);
      ChildControlsCreated = true;
  
      TrackViewState();
    }

  2.CreateControlHierarchy方法

    /**//// <summary>
    /// 创建一个带或不带指定数据源的控件层次结构
    /// </summary>
    /// <param name="useDataSource">指示是否要使用指定的数据源</param>
    //注意:当第二次执行数据绑定时,会执行两遍
    private void CreateControlHierarchy(bool useDataSource)
    {
      IEnumerable dataSource = null;
      int count = -1;
  
      if (useDataSource == false)
      {
        // ViewState must have a non-null value for ItemCount because this is checked
        // by CreateChildControls.
        count = (int)ViewState["ItemCount"];
        if (count != -1)
        {
          dataSource = new DummyDataSource(count);
        }
      }
      else
      {
        dataSource = this.dataSource;
      }
  
      //根据项类型开始创建子控件
      if (dataSource != null)
      {
        Table table = new Table();
        Controls.Add(table);
  
        //选中项索引
        int selectedItemIndex = SelectedIndex;
        //项索引
        int index = 0;
        //项数量
        count = 0;
        foreach (object dataItem in dataSource)
        {
  
          ListItemType itemType = ListItemType.Item;
          if (index == selectedItemIndex)
          {
           
            itemType = ListItemType.SelectedItem;
          }
          else if (index % 2 != 0)
          {
            itemType = ListItemType.AlternatingItem;
          }
  
          //根据不同项索引创建样式
          CreateItem(table, index, itemType, useDataSource, dataItem);
          count++;
          index++;
        }
      }
      //执行绑定时执行时执行
      if (useDataSource)
      {
        //保存项数量
        ViewState["ItemCount"] = ((dataSource != null) ? count : -1);
      }
    }
  
    //创建项
    private TemplatedListItem CreateItem(Table table, int itemIndex, ListItemType itemType, bool dataBind, object dataItem)
    {
      TemplatedListItem item = new TemplatedListItem(itemIndex, itemType);
      TemplatedListItemEventArgs e = new TemplatedListItemEventArgs(item);
  
      if (itemTemplate != null)
      {
        itemTemplate.InstantiateIn(item.Cells[0]);
      }
      if (dataBind)
      {
        item.DataItem = dataItem;
      }
      //注意事件触发顺序
      OnItemCreated(e);
      table.Rows.Add(item);
  
      if (dataBind)
      {
        item.DataBind();
        OnItemDataBound(e);
  
        item.DataItem = null;
      }
  
      return item;
    }

责编:豆豆技术应用

正在加载评论...