向web端的api发送http请求,得到的结果是xml格式的节点信息,id标识节点号,pid标识该节点的父节点(0表示根),name是名字。
节点信息本来是web端通过dfs得到的。
原本的思路是:根据xml节点,解析它,构建邻接矩阵或者邻接表,用dfs(先序,遍历到就添加到treeview里去)生成treeview,c语言做算法实现比较好搞,c#水平有限,毕竟google没了,自己baidu做项目 = =
换了个思路,因为api得到的xml节点顺序正好是dfs得到的,因此我只要根据这个顺序建立节点绝对没问题,因为每个节点插入进去,绝对能够找到父节点!
有思路了,直接开撸。
附上xml:
-
1
0
5YiG57G7MQ==
-
2
1
5YiG57G7MS0x
-
3
2
5YiG57G7MS0xLTE=
-
4
2
5YiG57G7MS0xLTI=
-
5
1
5YiG57G7MS0y
-
6
0
5YiG57G7Mg==
-
9
6
5YiG57G7Mi0x
name是用base64编码过的结果,取出来解码就可以。
使用了一个类来定义xml的节点,便于还原节点。
附上treeNode的定义:
public class TreesNode
{
public TreesNode parent;
private int id; //当前节点id
public int Id
{
get { return id; }
set { id = value; }
}
private int pid; //父节点 0表示根
public int Pid
{
get { return pid; }
set { pid = value; }
}
public string name = null;
public TreesNode(int id, int pid, string name)
{
this.id = id;
this.pid = pid;
this.name = TreesNode.decriptionBase64(name);
}
public static string decriptionBase64(string oralName)
{
byte[] outputb = Convert.FromBase64String(oralName); //base64解码
string resultName = Encoding.GetEncoding("utf-8").GetString(outputb);
return resultName;
}
}
///
/// 解析xml 生成dfs需要的数组
///
///
public void translateXML(string xmlFile)
{
int id, pid,temp;
string name;
XmlDocument doc = new XmlDocument();
doc.Load(xmlFile); //加载Xml文件
XmlElement rootElem = doc.DocumentElement; //获取根节点
XmlNodeList itemNodes = rootElem.GetElementsByTagName("item"); //获取item子节点集合
//根节点先进去
ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode firstOne = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode(0, 0, "5pyN5Yqh5Zmo"); //服务器
firstOne.parent = null;
actualTreeNodes[0] = firstOne;
countActualTreeNodes++;
//之后所有的item节点根据xml放进数组中去
foreach (XmlNode node in itemNodes)
{
//读取item下的id pid name
XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("id");
if (int.TryParse(subAgeNodes[0].InnerText, out temp) == true)
{
id = temp;
subAgeNodes = ((XmlElement)node).GetElementsByTagName("pid");
if (int.TryParse(subAgeNodes[0].InnerText, out temp) == true)
{
pid = temp;
subAgeNodes = ((XmlElement)node).GetElementsByTagName("name");
name = subAgeNodes[0].InnerText;
//ok!!!!生成数组!!!! 节点的顺序就是web端dfs得到的,
//根据 id 确定存放在 actualTreeNode 数组的位置,通过每个对象的 pid 属性来确定添加到对应的 treeview 节点下
ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode tempNode = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode(id, pid, name);
tempNode.parent = actualTreeNodes[pid];
actualTreeNodes[id] = tempNode;
if( tempNode.Id > countActualTreeNodes )
{
countActualTreeNodes = tempNode.Id;
}
}
}
用了数组来保存解析的node并且计数方便读取。
//存放xml读取出来的treenode节点,先从xml读取出来生成数组,然后treeview根据每个节点的father为treeview来add节点
private ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode[] actualTreeNodes = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode[50];
//计数
private int countActualTreeNodes = 0;
然后生成treeview即可,思路:
根据actualTreeNodes数组,添加每个节点到treeview,根据name遍历寻找父亲节(xml是dfs得到所以父亲) 点然后添加(拿name遍历数组即可)///
/// 解析xml 生成dfs需要的数组
///
///
public void translateXML(string xmlFile)
{
int id, pid,temp;
string name;
XmlDocument doc = new XmlDocument();
doc.Load(xmlFile); //加载Xml文件
XmlElement rootElem = doc.DocumentElement; //获取根节点
XmlNodeList itemNodes = rootElem.GetElementsByTagName("item"); //获取item子节点集合
//根节点先进去
ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode firstOne = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode(0, 0, "5pyN5Yqh5Zmo"); //服务器
firstOne.parent = null;
actualTreeNodes[0] = firstOne;
countActualTreeNodes++;
//之后所有的item节点根据xml放进数组中去
foreach (XmlNode node in itemNodes)
{
//读取item下的id pid name
XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("id");
if (int.TryParse(subAgeNodes[0].InnerText, out temp) == true)
{
id = temp;
subAgeNodes = ((XmlElement)node).GetElementsByTagName("pid");
if (int.TryParse(subAgeNodes[0].InnerText, out temp) == true)
{
pid = temp;
subAgeNodes = ((XmlElement)node).GetElementsByTagName("name");
name = subAgeNodes[0].InnerText;
//ok!!!!生成数组!!!! 节点的顺序就是web端dfs得到的,
//根据 id 确定存放在 actualTreeNode 数组的位置,通过每个对象的 pid 属性来确定添加到对应的 treeview 节点下
ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode tempNode = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode(id, pid, name);
tempNode.parent = actualTreeNodes[pid];
actualTreeNodes[id] = tempNode;
if( tempNode.Id > countActualTreeNodes )
{
countActualTreeNodes = tempNode.Id;
}
}
}
}
}
///
/// 根据actualTreeNodes数组,添加每个节点到treeview,根据name遍历寻找父亲节点然后添加(拿name遍历数组即可)
///
public void addTreeViewNode()
{
treeViewNode.Nodes.Clear();
treeViewNode.Nodes.Add(new TreeNode("服务器")); //根节点加入treeview
for (int i = 1; i <= countActualTreeNodes; i++)
{
//取得当前节点 遍历以前的所有节点找它的父节点,然后添加到父节点下面去!
//遍历所有treeview中的节点,寻找当前节点的父节点,插入treeview中去(根据dfs的结果,父节点一定存在)
//currentNode为当前需要插入节点,遍历treeviewNode中所有节点,寻找它的父亲,插入父亲下面!父亲一定存在!
ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode currentNode = actualTreeNodes[i];
//更新bool
//finish = false;
if (currentNode == null)
{
continue;
}
foreach (TreeNode item in treeViewNode.Nodes)
{
// item是当前节点,这里是遍历所有treeview节点,找出actual[i]的父亲,然后插入i
TreeNode node = GetNode(item, i);
if (currentNode.parent.name == node.Text )
{
Console.WriteLine("fuck1");
TreeNode tempInsertOne = new TreeNode(currentNode.name);
treeViewNode.SelectedNode = node;
treeViewNode.SelectedNode.Nodes.Add(tempInsertOne);
//node.Nodes.Add(tempInsertOne); //这个add这里有问题!
//finish = true;
break;
}
else
{
continue;
}
}
}
treeViewNode.CollapseAll();
}
//遍历子节点
public TreeNode GetNode(TreeNode currentRoot, int currentNumber)
{
if (currentRoot.Nodes.Count == 0) //如果是根,返回
{
Console.WriteLine("fuck3");
//return currentRoot.Nodes[0];
return treeViewNode.TopNode; //返回定点 只会执行一次
}
else if (treeViewNode.Nodes.Count != 0) //非根节点
{
Console.WriteLine("fuck4");
TreeNode[] treeNodes = treeViewNode.Nodes.Find(currentRoot.Name, true); //可以返回所有以currentRoot.test为标识的节点
foreach (TreeNode temp in treeNodes)
{
if (actualTreeNodes[currentNumber].parent.name == temp.Text)
{
return temp;
//temp.Nodes.Add(new TreeNode(actualTreeNodes[currentNumber].name));
}
}
}
return currentRoot;
}
///
/// TreeViewNode点击事件相应
///
///
///
private void treeViewNode_AfterSelect(object sender, TreeViewEventArgs e)
{
string messageAfterSelect = string.Format("选中了{0}节点\n\n深度{1}的节点", treeViewNode.SelectedNode.Text, treeViewNode.SelectedNode.Level);
MessageBox.Show(messageAfterSelect, "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
}