TreeView´´½¨IHierarchicalDataSourceÀàÐ͵ÄÊý¾ÝԴʵÏÖ

¡¡¡¡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();