¡¡¡¡IHierarchicalDataSourceʵÏÖ:
¡¡¡¡public class InsHierarchyData : IHierarchyData, ICustomTypeDescriptor
¡¡¡¡{
¡¡¡¡private DataRowView item;
¡¡¡¡private string dataParentIdField;
¡¡¡¡private string dataIdField;
¡¡¡¡private string displayField;
¡¡¡¡public InsHierarchyData(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()
¡¡¡¡{
¡¡¡¡InsHierarchicalEnumerable children = new InsHierarchicalEnumerable();
¡¡¡¡foreach (DataRowView row in item.DataView)
¡¡¡¡{
¡¡¡¡string a = row[dataParentIdField].ToString();
¡¡¡¡string b = item[dataIdField].ToString();
¡¡¡¡if (a == b)
¡¡¡¡children.Add(new InsHierarchyData(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 InsHierarchyData(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<InsHierarchyDataPropertyDescriptor> list = new List<InsHierarchyDataPropertyDescriptor>();
¡¡¡¡foreach (PropertyDescriptor pd in pds)
¡¡¡¡{
¡¡¡¡list.Add(new InsHierarchyDataPropertyDescriptor(pd.Name));
¡¡¡¡}
¡¡¡¡InsHierarchyDataPropertyDescriptor[] arr = new InsHierarchyDataPropertyDescriptor[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 InsHierarchyDataPropertyDescriptor)
¡¡¡¡{
¡¡¡¡return this;
¡¡¡¡}
¡¡¡¡return null;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡public class InsHierarchyDataPropertyDescriptor : PropertyDescriptor
¡¡¡¡{
¡¡¡¡private string name;
¡¡¡¡public InsHierarchyDataPropertyDescriptor(string name)
¡¡¡¡: base(name, null)
¡¡¡¡{
¡¡¡¡this.name = name;
¡¡¡¡}
¡¡¡¡public override string Name
¡¡¡¡{
¡¡¡¡get { return name; }
¡¡¡¡}
¡¡¡¡public override Type ComponentType
¡¡¡¡{
¡¡¡¡get
¡¡¡¡{
¡¡¡¡return typeof(InsHierarchyData);
¡¡¡¡}
¡¡¡¡}
¡¡¡¡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)
¡¡¡¡{
¡¡¡¡InsHierarchyData shd = o as InsHierarchyData;
¡¡¡¡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 InsHierarchicalEnumerable : ArrayList, IHierarchicalEnumerable
¡¡¡¡{
¡¡¡¡IHierarchyData IHierarchicalEnumerable.GetHierarchyData(object enumeratedItem)
¡¡¡¡{
¡¡¡¡return (InsHierarchyData)enumeratedItem;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡public class InsHierarchicalDataSourceView : HierarchicalDataSourceView
¡¡¡¡{
¡¡¡¡string viewPath;
¡¡¡¡InsTreeViewDataSource owner;
¡¡¡¡public InsHierarchicalDataSourceView(InsTreeViewDataSource 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;
¡¡¡¡InsHierarchicalEnumerable data = new InsHierarchicalEnumerable();
¡¡¡¡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 InsHierarchyData(owner.DataParentIdField, owner.DataIdField, owner.DisplayField, crow));
¡¡¡¡}
¡¡¡¡return data;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡public class InsTreeViewDataSource : IHierarchicalDataSource
¡¡¡¡{
¡¡¡¡private InsHierarchicalDataSourceView view = null;
¡¡¡¡private string parentIdField;
¡¡¡¡private string idField;
¡¡¡¡private DataTable dataSource;
¡¡¡¡private string displayField;
¡¡¡¡public InsTreeViewDataSource(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 InsHierarchicalDataSourceView(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;//×Ô¶¨ÒåÊý¾ÝÔ´
¡¡¡¡InsTreeViewDataSource dataSource = new InsTreeViewDataSource("Parent_Id", "ID", "FULL_NAME", dt);
¡¡¡¡this.itvTree.DataSource = dataSource;
¡¡¡¡this.itvTree.DataBind();