算法问题

卡卡Gemini 2009-12-17 11:04:16
我编写了一个图形化编程的程序,通过在按钮之间连线来创建一棵树,然后遍历树来产生代码。但是在编写算法的时候遇到了一些问题,只有第一个被添加的按钮能够加入到树中,并且输出结果。其他后添加的按钮都不能识别。我认为可能发生问题的地方在FindNode()函数或者AddNode()函数中。但是找了很久都没有找到问题所在,请高手帮忙看下,谢谢。分不是问题,如果解决,可以另开帖给分。以下是代码



class CodeTree
{
public CodeTree()
{
tv = new TreeView();

NewTreeNode = new TreeNode[1000];

root = new TreeNode("root");

tv.Nodes.Add(root);

current = new TreeNode("current");
}

//在树中的current结点下添加一个结点
public TreeNode AddNode(CybotButton cb)
{
//新建一个数组
try
{
++i;
NewTreeNode[i] = new TreeNode(i.ToString());
NewTreeNode[i].Text = i.ToString();
NewTreeNode[i].Tag = cb;

TreeNode[] myTreeNodeArray = new TreeNode[1];
myTreeNodeArray[0] = NewTreeNode[i];
//在tv的current结点下添加一个NewTreeNode[i]结点
this.current.Nodes.AddRange(myTreeNodeArray);



}
catch (Exception e)
{
MessageBox.Show(e.Data.ToString());
}

return NewTreeNode[i];


}

//在树中删除掉current结
public void DeleteNode(TreeNode current)
{
//移除当前结点
tv.Nodes.Remove(current);

}

//遍历树,产生代码
public String TraversalTree()
{

//深度优先遍历
String str = "";

str = ShowAllNodes(this.tv.Nodes);

return str;
}

//采用递归的方式遍历树,输出代码
String ShowAllNodes(TreeNodeCollection tv)
{
foreach (TreeNode node in tv)
{

strCode += PrintCode(node) + '\n';
if (node.Nodes.Count > 0)
{
ShowAllNodes(node.Nodes);

}
}
return strCode;
}

//输出单个按钮的代码
public String PrintCode(TreeNode tn)
{
//这里TreeNode始终没有变
CybotButton cb = (CybotButton)tn.Tag;
String str = cb.GenerateCode();
return str;
}



//在树中寻找包含有按钮cb的结点,并返回这个结点
public TreeNode FindNode(TreeView tv,CybotButton cb)
{
TreeNode tnRet = new TreeNode("tnRet") ;
foreach (TreeNode tn in tv.Nodes)
{
//tnRet = FindNode(tn, cb);
if (tn.Tag == cb)
tnRet = tn;

break;
}

this.current = tnRet;

return tnRet;
}

//将以root为根的树整个删掉
public bool DeleteTree()
{

//移除根结点及其所有子结点
this.tv.Nodes.Remove(root);
return true;
}
public TreeNode[] NewTreeNode;
public String strCode;
public TreeNode root;
private TreeNode current;
public TreeView tv;
public static int i = 0;

}
...全文
156 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
卡卡Gemini 2009-12-21
  • 打赏
  • 举报
回复
结贴散分
卡卡Gemini 2009-12-17
  • 打赏
  • 举报
回复
此算法的遍历及添加部分已经解决,谢谢大家。继续看看还有没有更有建设性的意见,下周结贴散分
卡卡Gemini 2009-12-17
  • 打赏
  • 举报
回复
跟这个有关,我也是用您那个添加按钮的方式添加的,不过问题的重点不在这里,而在树的动态建立,还是谢谢您[Quote=引用 8 楼 wartim 的回复:]
是不是treeview里节点加按钮?
以前解答过一个
http://topic.csdn.net/u/20091209/22/7e5d7f30-04b9-48e7-8b4d-7a1c841cf5b4.html
[/Quote]
卡卡Gemini 2009-12-17
  • 打赏
  • 举报
回复
不知道您说的集合类是干什么用的,我的NewTreeNode数组就是用来盛放按钮的集合的,不知道是不是您说的这个概念[Quote=引用 6 楼 zanfeng 的回复:]
做一个树,首先你得弄个集合类吧。。
把东西放里面。。
然再根据集合类再把按钮放上去。

你可找个源码先看看如何写的。。


___________________________________
我写的vs2005源代码管理器,只有团队资源管理中源码管理的功能。
http://topic.csdn.net/u/20091203/10/ca40b678-5443-4a18-a9f6-fad9051d0797.html
[/Quote]
wartim 2009-12-17
  • 打赏
  • 举报
回复
是不是treeview里节点加按钮?
以前解答过一个
http://topic.csdn.net/u/20091209/22/7e5d7f30-04b9-48e7-8b4d-7a1c841cf5b4.html
卡卡Gemini 2009-12-17
  • 打赏
  • 举报
回复
这个ms跟我这个没关系吧,还是表示感谢[Quote=引用 2 楼 silentwins 的回复:]
不管怎样,先在Page_Load加上
C# codeif(this.IsPostBack)return;

看看
[/Quote]
足球中国 2009-12-17
  • 打赏
  • 举报
回复
做一个树,首先你得弄个集合类吧。。
把东西放里面。。
然再根据集合类再把按钮放上去。

你可找个源码先看看如何写的。。


___________________________________
我写的vs2005源代码管理器,只有团队资源管理中源码管理的功能。
http://topic.csdn.net/u/20091203/10/ca40b678-5443-4a18-a9f6-fad9051d0797.html
平生我自如 2009-12-17
  • 打赏
  • 举报
回复
学习!帮顶!
dqw120 2009-12-17
  • 打赏
  • 举报
回复
等待高手解答....
liherun 2009-12-17
  • 打赏
  • 举报
回复
太长了
silentwins 2009-12-17
  • 打赏
  • 举报
回复
不管怎样,先在Page_Load加上

if(this.IsPostBack)
return;


看看
liherun 2009-12-17
  • 打赏
  • 举报
回复
up
cykevin 2009-12-17
  • 打赏
  • 举报
回复
public TreeNode FindNode(TreeView tv,CybotButton cb)
{
TreeNode tnRet = new TreeNode("tnRet") ;
foreach (TreeNode tn in tv.Nodes)
{
//tnRet = FindNode(tn, cb);
if (tn.Tag == cb)
tnRet = tn;

break;
}

this.current = tnRet;

return tnRet;
}

标红部分break是不是应该跟rnRet=tn一起写在花括号里头。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧