HierarchicalDataSource
2007-06-07 15:27 Clingingboy 阅读(2688) 评论(2) 收藏 举报
分层数据的数据源控件的实现,使用treeview控件显示无限级分类
1.数据结构如下

2.定义节点对象,实现IHierarchyData接口,此为重点实现,因为是分层结构,所以要重复在判断是否有子节点和MessageID和ParentID是否相等.当然具体情况具体分析了
3.定义节点对象集合,实现IHierarchicalEnumerable接口
4.定义视图,继承HierarchicalDataSourceView类
5.最后定义数据源控件,实现IHierarchicalDataSource接口
贴下代码
(1)
(2)
public class SqlHierarchicalEnumerable : ArrayList, IHierarchicalEnumerable
{
IHierarchyData IHierarchicalEnumerable.GetHierarchyData(object enumeratedItem)
{
return (SqlHierarchyData)enumeratedItem;
}
}
(3)
(4)
public class CustomSqlDataSource : SqlDataSource, IHierarchicalDataSource
{
private SqlHierarchicalDataSourceView view = null;


HierarchicalDataSourceView IHierarchicalDataSource.GetHierarchicalView(string viewPath)
{
if (null == this.view)
this.view = new SqlHierarchicalDataSourceView(this, viewPath);

return this.view;
}

private static readonly object EventKey = new object();

event EventHandler IHierarchicalDataSource.DataSourceChanged
{
add
{
Events.AddHandler(EventKey, value);
}
remove
{
Events.RemoveHandler(EventKey, value);
}
}


public string DataParentIdField
{
get { return ViewState["DataParentIdField"] != null ? (string)ViewState["DataParentIdField"] : string.Empty; }
set { ViewState["DataParentIdField"] = value; }
}

public string DataIdField
{
get { return ViewState["DataIdField"] != null ? (string)ViewState["DataIdField"] : string.Empty; }
set { ViewState["DataIdField"] = value; }
}
}
使用
<asp:TreeView runat="Server" ID="tv" DataSourceID="MySource">
<DataBindings>
<asp:TreeNodeBinding DataMember="MessageID" TextField="Subject" ValueField="MessageID" />
</DataBindings>
</asp:TreeView>
<custom:CustomSqlDataSource
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="Select * From Messages"
DataIdField="MessageID" DataParentIdField="ParentID" ID="MySource"
runat="server">
</custom:CustomSqlDataSource>
效果
1.数据结构如下

2.定义节点对象,实现IHierarchyData接口,此为重点实现,因为是分层结构,所以要重复在判断是否有子节点和MessageID和ParentID是否相等.当然具体情况具体分析了
3.定义节点对象集合,实现IHierarchicalEnumerable接口
4.定义视图,继承HierarchicalDataSourceView类
5.最后定义数据源控件,实现IHierarchicalDataSource接口
贴下代码
(1)
(2)
public class SqlHierarchicalEnumerable : ArrayList, IHierarchicalEnumerable
{
IHierarchyData IHierarchicalEnumerable.GetHierarchyData(object enumeratedItem)
{
return (SqlHierarchyData)enumeratedItem;
}
}(3)
(4)
public class CustomSqlDataSource : SqlDataSource, IHierarchicalDataSource
{
private SqlHierarchicalDataSourceView view = null;

HierarchicalDataSourceView IHierarchicalDataSource.GetHierarchicalView(string viewPath)
{
if (null == this.view)
this.view = new SqlHierarchicalDataSourceView(this, viewPath);
return this.view;
}
private static readonly object EventKey = new object();
event EventHandler IHierarchicalDataSource.DataSourceChanged
{
add
{
Events.AddHandler(EventKey, value);
}
remove
{
Events.RemoveHandler(EventKey, value);
}
}

public string DataParentIdField
{
get { return ViewState["DataParentIdField"] != null ? (string)ViewState["DataParentIdField"] : string.Empty; }
set { ViewState["DataParentIdField"] = value; }
}
public string DataIdField
{
get { return ViewState["DataIdField"] != null ? (string)ViewState["DataIdField"] : string.Empty; }
set { ViewState["DataIdField"] = value; }
}
}使用
<asp:TreeView runat="Server" ID="tv" DataSourceID="MySource">
<DataBindings>
<asp:TreeNodeBinding DataMember="MessageID" TextField="Subject" ValueField="MessageID" />
</DataBindings>
</asp:TreeView>
<custom:CustomSqlDataSource
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="Select * From Messages"
DataIdField="MessageID" DataParentIdField="ParentID" ID="MySource"
runat="server">
</custom:CustomSqlDataSource>效果

浙公网安备 33010602011771号