SqlDataAdapter adp= new SqlDataAdapter("select * from tb_table", connString)
DataTable dtData=new DataTable()
adp.Fill(dtData)
TreeView tv//树控件
tv.Nodes.Clear()
// 获得第一级数据
DataRow[] drRoot=dtData.Select("len(varid)=3")
foreach(DataRow dr in drRoot)
{
TreeNode tn=new TreeNode()
tn.Text=dr["Name"].ToString()
AppendChild(tn,dr["varid"].ToString())
tv.Nodes.Add(tn)
}
}
Private void AppendChild(TreeNode tnParent,string varid)
{
DataRow[] drs=dtData.Select("substring(varid,0,"+varid.length+" and len(varid)="+varid.length+3))
foreach(DataRow dr in drs)
{
TreeNode tn=new TreeNode()
tn.Text=dr["Name"].ToString()
AppendChild(tn,dr["varid"].ToString())
tnParent.ChildNodes.Add(tn)
}
}
大概意思就是这样,自己拿去修改一了试试看
//////
动态绑定TreeView,递归
///
///
要绑定到的TreeView控件名称
///
准备绑定到TreeView控件的数据DataTable的名称
///
分级条件id,顶级分类ID为0
///
上级TreeNode节点名称,没有上级节点或或全新绑定这里写(TreeNode)null
///
节点的分级条件在数据库中的字段
///
节点绑定的显示的文本在数据库中的字段
///
节点绑定的Tag值在数据库中的字段
public
static
void
bind_treeview(TreeView
tv,
DataTable
dt,
int
Filterid,
TreeNode
node,string
Node_FLZD,string
NodeText_ZD,string
NodeTag_ZD)//绑定treeView的方法。
{
DataView
subView
=
dt.DefaultView
subView.RowFilter
=
Node_FLZD
+
"="
+
Filterid
//获得ID级别为当前ID的
foreach
(DataRowView
item
in
subView)
{
//如果上级ID为0就直接加载树下面
if
(Filterid
==
0)
{
TreeNode
treenodel
=
new
TreeNode()
//创建一个节点
treenodel.Text
=
item[NodeText_ZD].ToString()
//节点名称
int
id
=
Convert.ToInt32(item[NodeTag_ZD])
treenodel.Tag
=
id.ToString()
//节点值
tv.Nodes.Add(treenodel)
//
如果级别ID为0就直接加到根节点
bind_treeview(tv,
dt,
id,
treenodel,
Node_FLZD,
NodeText_ZD,
NodeTag_ZD)
//
递归调用
}
else
{
//不为0就加载传进来的子节点下
TreeNode
treenodel
=
new
TreeNode()
treenodel.Text
=
item[NodeText_ZD].ToString()
int
id
=
Convert.ToInt32(item[NodeTag_ZD])
treenodel.Tag
=
id.ToString()
treenodel.ExpandAll()
node.Nodes.Add(treenodel)
//把节点加入到当前节点下,
bind_treeview(tv,
dt,
id,
treenodel,
Node_FLZD,
NodeText_ZD,
NodeTag_ZD)
}
}
}
既然是递归,就有父节点子节点,首先数据库是这样设计的比如机构表 :根节点 省公安厅,市公安厅是这个省公安厅的,所以ParentID为省公安厅的ID,县公安厅的ParentID为对应市公安厅的ID
下面例子是B/S树的一段代码:
//组织机构下的子机构
var clientOrgUnit = Psap.WcfProxy.CenterServiceFactory.CreateOrgUnitServiceClient()
var orgUnits = clientOrgUnit.GetOrgUnitModelList("ParentId=" + parentID)//根据父节点ID找到下面的所有子节点
clientOrgUnit.Close()
foreach (var model in orgUnits) //遍历根节点下面的机构
{
ComponentArt.Web.UI.TreeViewNode node = new ComponentArt.Web.UI.TreeViewNode()
node.Text = model.Name
node.Value = Psap.Common.Enums.ObjectType.OrgUnit + "_" + model.ID
node.Expanded = false
node.ImageUrl = _ORGUNIT_IMAGE
node.ToolTip = model.Name
//node.ExpandedImageUrl = "folder_open.gif"
node.Selectable = false
String url = String.Format("View/TreeViewUrl.aspx?parentID={0}&childType=1", Server.UrlEncode(model.ID.ToString()))
node.ContentCallbackUrl = url
TreeView1.Nodes.Add(node)
}
这段代码每次都会发送请求到TreeViewUrl.aspx,然后得到ParentID找到子节点下面的子节点。
还一种递归的方式更容易理解:
如下面代码:
/// <summary>
/// 递归的创建子节点
/// </summary>
/// <param name="node"></param>
void AddChild(Microsoft.Web.UI.WebControls.TreeNode node)
{
Microsoft.Web.UI.WebControls.TreeNode node1
string p_id = node.ID
DataSet ds = DeptBll.GetUFList("supId =" + p_id)
for (int i = 0i <ds.Tables[0].Rows.Counti++)
{
node1 = new Microsoft.Web.UI.WebControls.TreeNode()
node1.ID = ds.Tables[0].Rows[i]["deptId"].ToString()
node1.Text = ds.Tables[0].Rows[i]["deptName"].ToString()
node1.NodeData = ds.Tables[0].Rows[i]["nlevel"].ToString() + "@" + ds.Tables[0].Rows[i]["deptType"].ToString() + "@" + ds.Tables[0].Rows[i]["code"].ToString()
node.Nodes.Add(node1)
AddChild(node1)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)