表结构为:
ID Name Code NodeType
1 测试 101 0
2 测试2 102 1
3 测试3 1020 0
4 测试4 10201 1
5 测试5 1020101 0
6 测试6 10202 0该表中,由Code和NodeType共同控制层级关系,
NodeType 为1,表示有子节点,为0表示无子节点
子节点的Code为父节点的code后添加任意数字,如 102 的子节点为 102 1020 10201...
但并非code后添加任意数字就是父子关系:如 1020 却并非 10201 的父节点,层级关系还得参照NodeType我将datatable定义成了全局变量,
方法为:
private void CreateTreeNode(TreeNode parentNode,string parentNodeCode,string parentNodeType)
{
//请高手填充方法,我自己写的递归存在这样问题,子节点会被加载两遍}请大家帮忙。
ID Name Code NodeType
1 测试 101 0
2 测试2 102 1
3 测试3 1020 0
4 测试4 10201 1
5 测试5 1020101 0
6 测试6 10202 0该表中,由Code和NodeType共同控制层级关系,
NodeType 为1,表示有子节点,为0表示无子节点
子节点的Code为父节点的code后添加任意数字,如 102 的子节点为 102 1020 10201...
但并非code后添加任意数字就是父子关系:如 1020 却并非 10201 的父节点,层级关系还得参照NodeType我将datatable定义成了全局变量,
方法为:
private void CreateTreeNode(TreeNode parentNode,string parentNodeCode,string parentNodeType)
{
//请高手填充方法,我自己写的递归存在这样问题,子节点会被加载两遍}请大家帮忙。
{
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(Code)=3");//位数为3的为父节点。
foreach (DataRow dr in drRoot)
{
TreeNode tn = new TreeNode();
tn.Text = dr["Name"].ToString();
AppendChild(tn, dr["code"].ToString());
tv.Nodes.Add(tn);
}
}
public void AppendChild(TreeNode tnParent, string code)
{
DataRow[] drs = dtData.Select("条件");
foreach (DataRow dr in drs)
{
TreeNode tn = new TreeNode();
tn.Text = dr["Name"].ToString();
AppendChild(tn, dr["code"].ToString());//递归
tnParent.ChildNodes.Add(tn);
}
}感觉你这个表设计的不好 为何不把CODE那一项改为父节点的ID呢或者加一列为父节点的ID 那么就好做了。
所以我才无比蛋疼啊。
这样操作是不行的,因为顶级父节点位数可能并不为3位
我上面的数据只是举例而已。
以下为我自己写的代码,但是加载出来的节点完全乱了。
private void CreateTreeNode(TreeNode parentNode,string parentNodeCode,string parentNodeType)
{ DataRow[] rows = _dataSource.Select("Code like '" + currentCode + "%'");
if (rows != null)
{
foreach (DataRow var in rows)
{
if (node == null)
{
TreeNode tempNode = new TreeNode(var["Name"].ToString(), var["ID"].ToString());
currentCode = var["Code"].ToString();
nodeType = var["NodeType"].ToString();
//判断当前节点是否已经存在
if (!ContainsTreeNode(tempNode))
{
CreateTreeNode(tempNode, currentCode, nodeType);
tvItem.Nodes.Add(tempNode); }
}
else
{
//当前nodeType为汇总级节点时,才将新节点添加为其子节点,否则
if (nodeType == "1")
{
if (var["ID"].ToString() != node.Value)
{
TreeNode childNode = new TreeNode(var["Name"].ToString(), var["ID"].ToString());
currentCode = var["Code"].ToString();
nodeType = var["NodeType"].ToString();
CreateTreeNode(childNode, currentCode, nodeType);
node.ChildNodes.Add(childNode);
}
}
}
}
}
}
{
String url = ConfigurationManager.ConnectionStrings["SDB"].ConnectionString;
String name = Session["id"].ToString();
String sql = "select * from WBlogin where ZH='" + name + "'";
TreeNode mu = new TreeNode("主目录");
TreeNode jc = new TreeNode("基础数据");
TreeNode cs = new TreeNode("CS查询");
TreeNode gl = new TreeNode("用户管理");
this.TreeView1.Nodes.Add(mu);
mu.ChildNodes.Add(jc);
mu.ChildNodes.Add(cs);
mu.ChildNodes.Add(gl);
SqlConnection con = new SqlConnection(url);
con.Open();
SqlCommand com = new SqlCommand(sql, con);
SqlDataReader sdr = com.ExecuteReader();
sdr.Read();
String fen = sdr["fenpei"].ToString();
String qy = fen.Substring(0, 1);
String cl = fen.Substring(1, 1);
String gz = fen.Substring(2, 1);
String sf = fen.Substring(3, 1);
String fenlei = fen.Substring(4, 1);
String ck = fen.Substring(5, 1);
String zl = fen.Substring(6, 1);
String fl = fen.Substring(7, 1);
String sk = fen.Substring(8, 1);
String jing = fen.Substring(9, 1);
String dx = fen.Substring(10, 1);
String ic = fen.Substring(11, 1);
String rz = fen.Substring(12, 1);
String yx = fen.Substring(13, 1);
String tj = fen.Substring(14, 1);
String xg = fen.Substring(15, 1);
String mm = fen.Substring(16, 1);
if (qy.Equals("1"))
{
TreeNode qy1 = new TreeNode("sss");
jc.ChildNodes.Add(qy1);
qy1.NavigateUrl = "Qyda.aspx";
}
if (cl.Equals("1"))
{
TreeNode cl1 = new TreeNode("ddd");
jc.ChildNodes.Add(cl1);
cl1.NavigateUrl = "CarInfo.aspx";
}
if (gz.Equals("1"))
{
TreeNode gz1 = new TreeNode("fff");
cs.ChildNodes.Add(gz1);
gz1.NavigateUrl = "Yield.aspx";
}
if (sf.Equals("1"))
{
TreeNode sf1 = new TreeNode("eee");
cs.ChildNodes.Add(sf1);
sf1.NavigateUrl = "Mingxi.aspx";
}
我是这么做的```````
谢谢了。不过我们的逻辑不同的。
哥们儿,这个真的不一样。
层级关系不同。我的父级code可能是1位,也可能是2位,也可能是3位。
我有了一点思路,就是先取所有nodetype=1的信息,然后判断这些信息是否有父级,如果没有父节点,则递归添加自己的子节点。
因为并非所有的节点都有子节点(如102有子节点,但是101没有),所以再取所有信息中nodetype=0的信息,判断是否有父节点,没有父节点,则直接添加到树
但是结果却有了问题,如本帖中的那张表的数据,显示结果如下(Code展示),1020101这个级别的节点多显示了一遍102
1020
10201
1020101
1020101
代码如下: private void InitData()
{
if (_dataSource != null && _dataSource.Rows.Count > 0)
{
#region 第一步 先按照汇总节点去查找
DataRow[] rows1 = _dataSource.Select("NodeType=1");
foreach (DataRow var in rows1)
{
TreeNode node = new TreeNode(var["Name"].ToString(),var["ID"].ToString());
string currentCode = var["Code"].ToString();
string nodeType = var["NodeType"].ToString();
//没有有父节点,则递归遍历子节点
if (!HasParentNode(node, currentCode))
{
CreateTreeNode(node, currentCode, nodeType);
tvItem.Nodes.Add(node);
}
}
#endregion #region 第二步 遍历datatable 将nodetype=0 且没有父节点的信息添加到treeview DataRow[] rows0 = _dataSource.Select("NodeType=0"); foreach (DataRow var in rows0)
{
TreeNode node = new TreeNode(var["Name"].ToString(), var["ID"].ToString());
string currentCode = var["Code"].ToString();
string nodeType = var["NodeType"].ToString();
//没有父节点,则添加当前节点
if (!HasParentNode(node, currentCode))
{
tvItem.Nodes.Add(node);
}
} #endregion }
} /// <summary>
/// 判断指定节点是否有父节点
/// </summary>
/// <param name="node"></param>
/// <param name="code"></param>
/// <returns></returns>
private bool HasParentNode(TreeNode node, string code)
{
if (_dataSource != null && _dataSource.Rows.Count > 0)
{
foreach (DataRow var in _dataSource.Rows)
{
string currentCode = var["Code"].ToString();
string nodeType = var["NodeType"].ToString();
string id = var["ID"].ToString();
//子节点code为父节点code后添加任意数量的数字
//父节点的nodeType必须为1
//父节点和子节点的id不同
if (code.IndexOf(currentCode) == 0 && id != node.Value && nodeType == "1")
{
return true;
} }
}
return false;
} /// <summary>
/// 获取指定父节点下所有子节点
/// </summary>
/// <param name="node"></param>
/// <param name="dt"></param>
/// <param name="currentCode"></param>
private void CreateTreeNode(TreeNode node, string currentCode, string nodeType)
{
if (_dataSource == null || _dataSource.Rows.Count <= 0)
{
return;
} #region DataView view = _dataSource.DefaultView;
view.RowFilter="Code like '" + currentCode + "%'";
view.Sort = "Code asc";
DataTable tempTable= view.ToTable();
if (tempTable.Rows != null)
{
foreach (DataRow var in tempTable.Rows)
{
//当前nodeType为汇总级节点时,才将新节点添加为其子节点,否则
if (nodeType == "1")
{
if (var["ID"].ToString() != node.Value)
{
TreeNode childNode = new TreeNode(var["Name"].ToString(), var["ID"].ToString());
string code = var["Code"].ToString();
string type = var["NodeType"].ToString();
node.ChildNodes.Add(childNode);
CreateTreeNode(childNode, code, type);
}
}
}
} #endregion
}请大家帮忙看看整个逻辑,哪出了问题。