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

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

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

PropertyDescriptorCollection propDescCol =
            typedList.GetItemProperties(null); //was (null)

  如果你为DataTable创建了DataView,将调用空引用返回DataSet中的一个DataTable,其将返回一个表集合列的属性描述符,继续看下去,该到DataMember出场的时候了,DataMember可以选择数据集中的特定表,

  如何不设置DataMember,将获取默认表,看下面代码片段

   判断dataMember字符数给propDesc赋值#region 判断dataMember字符数给propDesc赋值

          //获取属性描述符
          //若不指定dataMember属性则获取默认数据成员
          if ((dataMember == null) || (dataMember.Length < 1))
          {
            propDesc = propDescCol[0];
          }
          else 
            //尝试在属性集合中寻找数据成员
            propDesc = propDescCol.Find(dataMember, true);
  
          #endregion
  
          if (propDesc == null)
            throw new Exception("ListSource missing DataMember");

  这样我们就得到了一个DataTablePropertyDescriptor属性描述符,继续

          object listitem = list[0];
  
          //获取组件属性当前值
          object member = propDesc.GetValue(listitem);
  
          if ((member == null) || !(member is IEnumerable))
            throw new Exception("ListSource missing DataMember");
  
          return (IEnumerable)member;

  此处实现原理:

  DataViewManager会在其DataSet中的DataTableCollection中搜索datamember的值进行匹配,看下图,做这么多事情,我们一直在转换

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

  注GetValue用法

    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(Button1);
    PropertyDescriptor pd = properties.Find("Text", false);
    Button b=new Button();
    b.Text = "cc";
    object c=pd.GetValue(b);
    Response.Write(c);
    //return cc

  用GetValue方法获取listitem属性值,此属性跟datamember匹配,最后member得到的是一个DataView,

  DataView实现了IEnumerable,现在终于可以转换了

  到此为止就结束了,现在你可以成功的传入DataSet了.

  可能这个类个人认为理解起来比较累,多看几遍,多调试,多把代码动动,就会理解的深刻些,本人上面也纯属经验之谈,个人认为这个比较重要,所以分出来讲,希望对大家有帮助,错误之处还请大家提出

责编:豆豆技术应用

正在加载评论...