如何根据一个文本文件内容来产生TreeView控件的内容?文本文件内容如下:
abc {
111 {
aaa ;
bbb ;
ccc ;
}
}
在这里当然我每行字符串的内容已经省略,可能存在多个{}嵌套.
如上面最简单的嵌套生成的Tree也应该是abc是根结点,111是其下的一个分支,111下又有3个子结点.
请有这方面经验的大虾能给出一个好的解决方案谢谢!
abc {
111 {
aaa ;
bbb ;
ccc ;
}
}
在这里当然我每行字符串的内容已经省略,可能存在多个{}嵌套.
如上面最简单的嵌套生成的Tree也应该是abc是根结点,111是其下的一个分支,111下又有3个子结点.
请有这方面经验的大虾能给出一个好的解决方案谢谢!
解决方案 »
- c#中使用C1TrueDBGrid控件,想保存列序到XML文件,但我调整列序后用dbGrid.Columns.IndexOf()方法存进去的还是原列序
- 求 C# 图表控件
- 数据库连接弄到配置文件中出现的问题,跪求高手解答
- 关于简单的索引器
- 没有面向对象,面试失败的原因。
- 怎样使程序运行时动态加载图片到pictureBox中
- 试用期的超bt 练习题:Form 上面嵌个Excel,真tmd挂了,混不下去了,有卓越的顶级高手能救一命吗??
- C#怎样回收对U盘的访问
- winform中怎么用TREEVIEW中实现这样的功能
- 谁能帮我修改一下这个正则表达式
- 用C#搞了一个Windows Service项目和一个安装项目,总出现:Setup1.vdproj 不可恢复的生成错误
- C#中如何把数据写进缓存中?
另外to:copico(一路向北) 你说说的词法分析是指什么?(不要怪我问的问题太简单)
to:FlashElf(銘龘鶽) 可以调用系统函数具体是什么系统函数?要怎么做呢?
谢谢2位
我现在的做法是:
设了三个变量int nowparent=0
int countid=1;
int level=0;
当遇到{时:
把此行内容加入临时表
然后level=level+1;
nowparent=countid;
当遇到}时:
level=level-1;
nowparent=level;
这样肯定是有问题的因为如果遇到如下情况:
AAA {
BBB {
kkk=kkk
www {
111=111
222=222
333=333
}
444=444
}
CCC {
ddd=ddd
DDD {
111=111
222=222
333=333
}
aaa=aaa
bbb=bbb
ccc=ccc
}
}
循环到D{结束即到}时,}的父结点level这时和前面的www{}level一样了,于是包括}和下面的
aaa=aaa
bbb=bbb
ccc=ccc
都会处理到和www{}同级
请大家帮我想想这个算法正确的应该是怎样的?
现在就是在根据上面文本得到临时表的时候出现了问题:问题说的简单一点就是假如数据表有三个字段Id,Content,ParentId怎样确定ParentId的值往数据表中填充?
文件内容格式就是我上面给的那样
string[] mysSrinh=new string[22];
mysSrinh[0]="AAA{";
mysSrinh[1]="BBB{";
mysSrinh[2]="kkk=kkk";
mysSrinh[3]="www{";
mysSrinh[4]="111=111";
mysSrinh[5]="222=222";
mysSrinh[6]="333=333";
mysSrinh[7]="}";
mysSrinh[8]="444=444";
mysSrinh[9]="}";
mysSrinh[10]="CCC{";
mysSrinh[11]="ddd=ddd";
mysSrinh[12]="DDD{";
mysSrinh[13]="111=111";
mysSrinh[14]="222=222";
mysSrinh[15]="333=333";
mysSrinh[16]="}";
mysSrinh[17]="aaa=aaa";
mysSrinh[18]="bbb=bbb";
mysSrinh[19]="ccc=ccc";
mysSrinh[20]="}";
mysSrinh[21]="}";
//实际运行时你可以把文本文档中读出的数据变成字符串数组,每行对应数组中的一项。
TreeNode currentNode=new TreeNode();
Stack s=new Stack();
int level=0;
string nodeText;
for(int i=0;i<mysSrinh.Length;i++)
{
if(level==0)
{
nodeText=mysSrinh[i];
treeView1.Nodes.Add(nodeText.Trim('{'));
if(mysSrinh[i].EndsWith("{"))
{
level++;
currentNode=treeView1.Nodes[treeView1.Nodes.Count-1];
}
}
else
{
if(mysSrinh[i].EndsWith("{"))
{
if(level==0)
{
currentNode=treeView1.Nodes[treeView1.Nodes.Count-1];
currentNode.Nodes.Add(mysSrinh[i].Trim('{'));
}
else
{
s.Push(currentNode);
currentNode.Nodes.Add(mysSrinh[i].Trim('{'));
currentNode=currentNode.Nodes[currentNode.Nodes.Count-1];
}
level++;
}
else if(mysSrinh[i].StartsWith("}"))
{
if(level==1)
{
level--;
}
else
{
currentNode=(TreeNode)s.Pop();
level--;
}
}
else
{
currentNode.Nodes.Add(mysSrinh[i]);
}
}
}
我已经使用堆栈成功找到其父亲街结点位置并且能够记录
虽然后面还需要对树的结点进行增、删、改.但是从文件读取到树已经没有问题了.
希望以后大家还要多多帮助我这个初学者
PS:nnppc说的正则我还不会用,如果有机会还请不吝赐教
现在我就结帖了,再次谢谢大家关注本帖!