现有许多string类型的数据,都是表示目录的,比如:
"/.3/fedora-epel"
"/.3/fedora-epel/beta"
"/.3/fedora-epel/5"
"/.3/fedora-epel/5/SRPMS"
"/etc"
"/.3"
"/open/CAS"
"/open/Aircrack-ng"
... ...现在要做的是根据这些string数据,动态添加完成一个TreeView,以直观的方式显示该目录的层次结构。
TreeView控件这方面没问题,关键是如何提取这些string的内容,并判定父子节点的关系?新手求思路。
"/.3/fedora-epel"
"/.3/fedora-epel/beta"
"/.3/fedora-epel/5"
"/.3/fedora-epel/5/SRPMS"
"/etc"
"/.3"
"/open/CAS"
"/open/Aircrack-ng"
... ...现在要做的是根据这些string数据,动态添加完成一个TreeView,以直观的方式显示该目录的层次结构。
TreeView控件这方面没问题,关键是如何提取这些string的内容,并判定父子节点的关系?新手求思路。
分析这些字符串,保存到datatable中
字符串很好分析吧
比如 /.3/fedora-epel/5/SRPMS 按照/分割后得到char数组: .3 fedora-epel 5 SRPMS,接下来就不太明白了,如何动态建立treeview?根节点建立后怎么将上面几个元素建立为子节点?
一个字符串按照“/”拆分,从头往后,第一个子字符串是树节点第一层,那么在树节点Nodes里面找(ContainsKey)有没有,有的话找到节点继续往下,没有的话插入节点往下;然后第二层,在前面那个节点下面去找有没有存在的节点,有的话找到节点继续往下,没有的话插入节点再往下……不重复了,字多也没钱。
然后下一个字符串,从根节点重新开始找……对了插入和查找的时候可以用键,效率高一些。
再请教一下前辈,我自己捣鼓了一下,代码如下:
TreeNode tn = new TreeNode(); //先建好根节点
tn.Text = "根节点";
treeView1.Nodes.Add(tn); string[] s = new string[] {"aaa","bbb","ccc","ddd","eee" };
TreeNode tns = treeView1.Nodes[0]; //第一轮建立子节点
foreach (var item in s)
{
tns.Nodes.Add(item);
tns = tns.Nodes[0];
}
//第二轮建立子节点,(又有一组数据)这次就需要判断是否有重复的节点,若有则跳过不建立,否则建立。
string[] s2 = new string[] {"aaa","222","ccc","333","eee" };
TreeNode tns2 = treeView1.Nodes[0];
foreach (var item2 in s2)
{
if (tns2.Nodes[0].Text.CompareTo(item2)!=0)
{
tns2.Nodes.Add(item2);
}
tns2 = tns2.Nodes[0];
}以上代码可以实现建立功能,但现在有很多这样的数据,它们都是实时捕捉的:
"/.3/fedora-epel"
"/.3/fedora-epel/beta"
"/.3/fedora-epel/5"
"/.3/fedora-epel/5/SRPMS"
"/etc"
"/.3"
"/open/CAS"
"/open/Aircrack-ng"
... ...
拆分可以实现,用
sub_dir = string_dir.Split(new char[] { '/' });
得到若干目录名,然后依照上面的方法建立子节点。上面就建立了2轮,写了2个foreach,但是后面还有好多好多轮...... 如何将第一轮、第二轮以及后面的几轮写到一个循环里呢?谢谢!
private void addeNodes(String[] s2,TreeNode tns)
{
foreach (var item2 in s2)
{
if (tns.Nodes[0].Text.CompareTo(item2)!=0)
{
tns.Nodes.Add(item2);
}
tns= tns.Nodes[0];
}
}
前辈遇到一个问题:
if(count != 0)
{
for (int j = 0; j < count; j++)
{
(tns.Nodes[j].Text.CompareTo(item)) != 0;
}
}这段代码我原本想实现:count表示该节点的下一级节点数,然后用tns.Nodes[j].Text.CompareTo(item) != 0 这个语句来实现遍历tns节点的所有下一级节点用于与item比较,但是却提示我tns.Nodes[j].Text.CompareTo(item)) != 0这句不能作为语句?有红色的下划线,那么如何遍历某一节点的所有下一级节点呢?(不是所有子节点,只是所有下一级的节点)
谢谢回复,请教一下,这里tns.Nodes[0].Text.CompareTo(item2)!=0只能判断tns的第一个子节点是否与item2相等,请问如何遍历tns节点的所有下一级节点呢?(不是所有子节点,只是所有下一级的节点)
public void InsertTree(string[] s)
{
int jj = 0, ii = 0;
TreeNode tns = treeView1.Nodes[0];
foreach (var item in s)
{
if (item != "")
{
int count = tns.Nodes.Count;
int flag = 0;
if (count == 0)
{
tns.Nodes.Add(item);
tns = tns.Nodes[0];
}
else
{
for (int j = 0; j < count; j++)
{
if ((tns.Nodes[j].Text.CompareTo(item)) != 0)
{
flag = 1; //不存在该节点
ii = j;
}
else
{
flag = 0;
jj = j;
break;
}
}
if (flag == 1)
{
tns.Nodes.Add(item);
tns = tns.Nodes[ii + 1];
}
else
{
tns = tns.Nodes[jj];
}
}
}
}
}
我是初学者,代码效率估计很低,但是可实现功能。