为TreeView创建IHierarchicalDataSource类型的数据源实现

时间:2021-09-02 10:13:22

IHierarchicalDataSource实现:

public class SharpHierarchyData : IHierarchyData, ICustomTypeDescriptor
  {
    private DataRowView item;
    private string dataParentIdField;
    private string dataIdField;
    private string displayField;
    public SharpHierarchyData(string dataParentIdField, string dataIdField,string displayField, DataRowView item)
    {
      this.item = item;
      this.dataParentIdField = dataParentIdField;
      this.dataIdField = dataIdField;
      this.displayField = displayField;
    }
    bool IHierarchyData.HasChildren
    {
      get
      {
        foreach (DataRowView row in item.DataView)
        {
            object[] array1 = row.Row.ItemArray;
            object[] array2 = item.Row.ItemArray;
            string a = row[dataParentIdField].ToString();
            string b = item[dataIdField].ToString();
            if (a == b)
            return true;
        }
        return false;
      }
    }
    object IHierarchyData.Item
    {
      get
      {
        return item;
      }
    }
    public override string ToString()
    {
        return item[displayField].ToString();
    }
    string IHierarchyData.Path
    {
      get
      {
        string path = "/*[position()=1]";
        GetPath(item, ref path);
        return path;
      }
    }

      void GetPath(DataRowView crow, ref string path)
      {
         
          foreach (DataRowView row in item.DataView)
          {
              string c, d;
              c = crow.Row.ItemArray[2].ToString();
              d = crow.Row.ItemArray[0].ToString();
              string a = crow[dataParentIdField].ToString();
              string b = row[dataIdField].ToString();
              if (a == b)
              {
                  path = "/*[position()=1]" + path;
              }
          }
      }

    string IHierarchyData.Type
    {
        get { return displayField; }
    }
    IHierarchicalEnumerable IHierarchyData.GetChildren()
    {
        SharpHierarchicalEnumerable children = new SharpHierarchicalEnumerable();
        foreach (DataRowView row in item.DataView)
        {
            string a = row[dataParentIdField].ToString();
            string b = item[dataIdField].ToString();
            if (a == b)
              children.Add(new SharpHierarchyData(dataParentIdField, dataIdField,displayField, row));
        }

        return children;
    }
    IHierarchyData IHierarchyData.GetParent()
    {
        foreach (DataRowView row in item.DataView)
        {
            string a = item[dataParentIdField].ToString();
            string b = row[dataIdField].ToString();
            if (a == b)
                return new SharpHierarchyData(dataParentIdField, dataIdField,displayField, row);
        }

      return null;
    }
    System.ComponentModel.AttributeCollection ICustomTypeDescriptor.GetAttributes()
    {
      return TypeDescriptor.GetAttributes(this, true);
    }
    string ICustomTypeDescriptor.GetClassName()
    {
      return TypeDescriptor.GetClassName(this, true);
    }
    string ICustomTypeDescriptor.GetComponentName()
    {
      return TypeDescriptor.GetComponentName(this, true);
    }
    TypeConverter ICustomTypeDescriptor.GetConverter()
    {
      return TypeDescriptor.GetConverter(this, true);
    }
    EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
    {
      return TypeDescriptor.GetDefaultEvent(this, true);
    }
    PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
    {
      return TypeDescriptor.GetDefaultProperty(this, true);
    }
    object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
    {
      return TypeDescriptor.GetEditor(this, editorBaseType, true);
    }
    EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
    {
      return TypeDescriptor.GetEvents(this, attributes, true);
    }
    EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
    {
      return TypeDescriptor.GetEvents(this, true);
    }
    PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
    {
      PropertyDescriptorCollection pds = TypeDescriptor.GetProperties(item);

      if (pds.Count > 0)
      {
          List<SharpHierarchyDataPropertyDescriptor> list = new List<SharpHierarchyDataPropertyDescriptor>();

        foreach (PropertyDescriptor pd in pds)
        {
            list.Add(new SharpHierarchyDataPropertyDescriptor(pd.Name));
        }

        SharpHierarchyDataPropertyDescriptor[] arr = new SharpHierarchyDataPropertyDescriptor[list.Count];
        list.CopyTo(arr);

        return new PropertyDescriptorCollection(arr);
      }


      return PropertyDescriptorCollection.Empty;

    }

    PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
    {
      return ((ICustomTypeDescriptor)this).GetProperties(null);
    }

    object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
    {
        if (pd is SharpHierarchyDataPropertyDescriptor)
      {
        return this;
      }

      return null;
    }

  }
public class SharpHierarchyDataPropertyDescriptor : PropertyDescriptor
  {
    private string name;


    public SharpHierarchyDataPropertyDescriptor(string name)
      : base(name, null)
    {
      this.name = name;
    }

    public override string Name
    {
      get { return name; }
    }

    public override Type ComponentType
    {
      get
      {
          return typeof(SharpHierarchyData);
      }
    }

    public override bool IsReadOnly
    {
      get
      {
        return true;
      }
    }

    public override Type PropertyType
    {
      get
      {
        return Type.GetType("System.String");
      }
    }


    public override bool CanResetValue(object o)
    {
      return false;
    }

    public override object GetValue(object o)
    {
        SharpHierarchyData shd = o as SharpHierarchyData;

      if (shd != null)
      {
        IHierarchyData hd = (IHierarchyData)shd;
        string subject = ((DataRowView)(hd.Item))[name].ToString();
        return subject;
      }

      return null;
    }

    public override void ResetValue(object o)
    {
      throw new NotSupportedException();
    }


    public override void SetValue(object o, object value)
    {
      throw new NotSupportedException();
    }

    public override bool ShouldSerializeValue(object o)
    {
      return true;
    }

    public override TypeConverter Converter
    {
      get { return TypeDescriptor.GetConverter(typeof(System.String)); }
    }
  }
public class SharpHierarchicalEnumerable : ArrayList, IHierarchicalEnumerable
  {
 
    IHierarchyData IHierarchicalEnumerable.GetHierarchyData(object enumeratedItem)
    {
        return (SharpHierarchyData)enumeratedItem;
    }
  }
public class SharpHierarchicalDataSourceView : HierarchicalDataSourceView
  {
    string viewPath;
    SharpTreeViewDataSource owner;
    public SharpHierarchicalDataSourceView(SharpTreeViewDataSource owner, string viewPath)
    {
      this.viewPath = viewPath;
      this.owner = owner;
    }
    public override IHierarchicalEnumerable Select()
    {     
      //DataView dv = (DataView)this.owner.Select(DataSourceSelectArguments.Empty);
      DataView dv = (DataView)this.owner.DataView;
      SharpHierarchicalEnumerable data = new SharpHierarchicalEnumerable();
      bool hasParent = false;
      foreach (DataRowView crow in dv)
      {
          object[] array1 = crow.Row.ItemArray;
        hasParent = false;

        foreach (DataRowView prow in dv)
        {
            object[] array2 = prow.Row.ItemArray;
            //子节点
            string a = crow[owner.DataParentIdField].ToString();
            //根节点
            string b = prow[owner.DataIdField].ToString();
            if (a == b)
            {
                hasParent = true;
                break;
            }
        }
        //添加根节点
        if (!hasParent)
            data.Add(new SharpHierarchyData(owner.DataParentIdField, owner.DataIdField, owner.DisplayField, crow));
      }

      return data;
    }

  }
public class SharpTreeViewDataSource : IHierarchicalDataSource
  {
    private SharpHierarchicalDataSourceView view = null;
    private string parentIdField;
    private string idField;
      private DataTable dataSource;
      private string displayField;
      public SharpTreeViewDataSource(string parentIdField, string idField, string displayField,DataTable dataSource)
      {
          this.parentIdField = parentIdField;
          this.idField = idField;
          this.displayField = displayField;
          this.dataSource = dataSource;
      }
      public DataView DataView
    {
        get
        {
            return this.dataSource.DefaultView;
        }
    }
    HierarchicalDataSourceView IHierarchicalDataSource.GetHierarchicalView(string viewPath)
    {
      if (null == this.view)
          this.view = new SharpHierarchicalDataSourceView(this, viewPath);

      return this.view;
    }
    public string DataParentIdField
    {
        get { return parentIdField; }
        set { parentIdField = value; }
    }
    public string DataIdField
    {
        get { return idField; }
        set { idField = value; }
    }
      public string DisplayField
      {
          get { return displayField; }
          set { displayField = value; }
      }
    public event EventHandler DataSourceChanged;
}

客户端代码:

DataTable dt = null;//自定义数据源
SharpTreeViewDataSource dataSource = new SharpTreeViewDataSource("Parent_Id", "ID", "FULL_NAME", dt);
this.itvTree.DataSource = dataSource;
this.itvTree.DataBind();

感谢Clingingboy原文的分享(http://www.cnblogs.com/Clingingboy/archive/2007/06/07/775353.html)