当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > TreeView创建IHierarchicalDataSource类型的数据源实现

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

ASP.NET 中的 TreeView创建IHierarchicalDataSource类型的数据源实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 217 ::
收藏到网摘: n/a

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