C#winform使用TreeView,每次添加节点前对节点进行查重--有重复的节点就跳框显示(使用messagebox.show()),但总是出错误,会出现明明没有该节点却报有重复导致不能添加节点,但是这个问题不是每次都出现,偶尔会出现,试验了一下,就是查重方法的递归调用出的问题,把递归调用注释掉就不出错了,但是没递归调用又没法查重,请给解决下,要求能正常查重并添加节点。
下面是查重方法的代码
private void Check(TreeNodeCollection treeNodes) //检查Tree View控件中是否已经存在指定用户的节点
{
tmpBool = false;
foreach (TreeNode treeNode in treeNodes)
{
//unit,user,lowest是由form输入的值,一次只能输入三个中的一个
if (treeNode.Text.Equals(unit)|| treeNode.Text.Equals(user)|| treeNode.Text.Equals(lowest))
{
treeNode.BackColor = Color.Red; //将节点的背景颜色设为红色
treeNode.Parent.Expand(); //展开父节点
repeatable = true; //设置repeatable为true,表示在三级节点中找到了该用户
}
if (treeNode.Nodes.Count > 0)
{
Check(treeNode.Nodes); //递归调用CheckUser,查找子节点中是否存在该用户
}
}
}
添加节点的代码:
添加最上级节点
private void AddArea_Click(object sender, EventArgs e)
{
//创建AddUser窗体的实例
AddUnit form = new AddUnit(this);
//显示窗体,等待用户输入
// if (form.ShowDialog()== DialogResult.OK)
form.ShowDialog();
if (!string.IsNullOrEmpty(unit))
{
//检查Tree View控件中是否已经存在指定用户的节点
Check(this.treeView1.Nodes);
if (repeatable)
{
//如果用户已经存在,弹出确认对话框
MessageBox.Show("[" + unit + "]已经存在");
}
else
{ //如果用户不存在,创建新的节点
TreeNode node = CreateRootNode();
//TreeNode selectNode = this.treeView1.SelectedNode;
//selectNode.Nodes.Add(node); //adduser
this.treeView1.Nodes[0].Nodes.Add(node);
SaveToXml(); //重新从XML文件中加载数据并更新Tree View控件
LoadFormXml();
}
}
// }
repeatable = false; //重置repeatable
}
添加二级节点
private void AddUser_Click(object sender, EventArgs e)
{
//创建AddUser窗体的实例
AddUser form = new AddUser(this);
//显示窗体,等待用户输入
if (form.ShowDialog() == DialogResult.OK)
{
if (!string.IsNullOrEmpty(user))
{
//检查Tree View控件中是否已经存在指定用户的节点
Check(this.treeView1.Nodes);
if (repeatable)
{
//如果用户已经存在,弹出确认对话框
MessageBox.Show("[" + user + "]已经存在");
}
else
{ //如果用户不存在,创建新的节点
TreeNode node = CreateChildNode();
TreeNode selectNode = this.treeView1.SelectedNode;
selectNode.Nodes.Add(node);
SaveToXml(); //重新从XML文件中加载数据并更新Tree View控件
LoadFormXml();
}
}
}
repeatable = false; //重置repeatable
}
添加三级节点
private void AddLowest_Click(object sender, EventArgs e)
{
//创建AddUser窗体的实例
AddLowest form = new AddLowest(this);
//显示窗体,等待用户输入
if (form.ShowDialog() == DialogResult.OK)
{
if (!string.IsNullOrEmpty(lowest))
{
//检查Tree View控件中是否已经存在指定用户的节点
Check(this.treeView1.Nodes);
if (repeatable)
{
//如果用户已经存在,弹出确认对话框
MessageBox.Show("[" + lowest + "]已经存在");
}
else
{ //如果用户不存在,创建新的节点
TreeNode node = CreateLowestNode();
TreeNode selectNode = this.treeView1.SelectedNode;
selectNode.Nodes.Add(node); //adduser
SaveToXml(); //重新从XML文件中加载数据并更新Tree View控件
LoadFormXml();
}
}
}
repeatable = false; //重置repeatable
}
基于Monster 组和GPT的调写:
可能出现问题的地方在于递归调用Check()方法时,没有正确处理重复节点的情况。当递归查找到重复节点时,应该立即停止递归,而不是继续查找。
修改后的Check()方法代码:
private bool Check(TreeNodeCollection treeNodes, string text)
{
foreach (TreeNode treeNode in treeNodes)
{
if (treeNode.Text.Equals(text))
{
treeNode.BackColor = Color.Red;
treeNode.Parent.Expand();
return true; // 找到重复节点,停止递归
}
if (treeNode.Nodes.Count > 0)
{
bool isDuplicate = Check(treeNode.Nodes, text); // 传递isDuplicate到子节点
if (isDuplicate)
{
return true; // 子节点中找到重复节点,停止递归
}
}
}
return false; // 没有找到重复节点
}
修改后的添加节点的代码:
private void AddArea_Click(object sender, EventArgs e)
{
// ...
if (!string.IsNullOrEmpty(unit))
{
bool isDuplicate = Check(this.treeView1.Nodes, unit);
if (isDuplicate)
{
// 如果存在重复节点,直接返回
return;
}
// 创建新的节点
TreeNode node = CreateRootNode();
this.treeView1.Nodes[0].Nodes.Add(node);
SaveToXml();
LoadFormXml();
}
// ...
}
private void AddUser_Click(object sender, EventArgs e)
{
// ...
if (!string.IsNullOrEmpty(user))
{
bool isDuplicate = Check(this.treeView1.Nodes, user);
if (isDuplicate)
{
// 如果存在重复节点,直接返回
return;
}
// 创建新的节点
TreeNode node = CreateChildNode();
TreeNode selectNode = this.treeView1.SelectedNode;
selectNode.Nodes.Add(node);
SaveToXml();
LoadFormXml();
}
// ...
}
private void AddLowest_Click(object sender, EventArgs e)
{
// ...
if (!string.IsNullOrEmpty(lowest))
{
bool isDuplicate = Check(this.treeView1.Nodes, lowest);
if (isDuplicate)
{
// 如果存在重复节点,直接返回
return;
}
// 创建新的节点
TreeNode node = CreateLowestNode();
TreeNode selectNode = this.treeView1.SelectedNode;
selectNode.Nodes.Add(node);
SaveToXml();
LoadFormXml();
}
// ...
}
该答案引用ChatGPT的部分内容:
根据您提供的代码,问题可能是递归调用Check方法时,没有及时重置repeatable变量的值。因此,在一次查重操作完成后,repeatable变量的值仍然为true,这会导致在下一次添加节点时,即使该节点不存在,也会出现“重复”的提示框。为解决该问题,可以将repeatable变量的赋值和重置操作移到Check方法内部,每次查找时重新初始化。
以下是修改后的Check方法代码:
private void Check(TreeNodeCollection treeNodes)
{
foreach (TreeNode treeNode in treeNodes)
{
if (treeNode.Text.Equals(unit) || treeNode.Text.Equals(user) || treeNode.Text.Equals(lowest))
{
treeNode.BackColor = Color.Red;
treeNode.Parent.Expand();
repeatable = true;
}
if (treeNode.Nodes.Count > 0)
{
Check(treeNode.Nodes);
}
}
if (repeatable)
{
MessageBox.Show("[" + (string.IsNullOrEmpty(lowest) ? (string.IsNullOrEmpty(user) ? unit : user) : lowest) + "]已经存在");
}
repeatable = false;
}
同时,需要在添加节点的方法中调用Check方法之前,将repeatable变量重置为false。
以下是修改后的AddArea_Click方法代码:
private void AddArea_Click(object sender, EventArgs e)
{
AddUnit form = new AddUnit(this);
form.ShowDialog();
if (!string.IsNullOrEmpty(unit))
{
repeatable = false; // 重置repeatable变量
Check(this.treeView1.Nodes);
if (!repeatable)
{
TreeNode node = CreateRootNode();
this.treeView1.Nodes[0].Nodes.Add(node);
SaveToXml();
LoadFormXml();
}
}
}
以下是修改后的AddUser_Click方法代码:
private void AddUser_Click(object sender, EventArgs e)
{
AddUser form = new AddUser(this);
if (form.ShowDialog() == DialogResult.OK)
{
if (!string.IsNullOrEmpty(user))
{
repeatable = false; // 重置repeatable变量
Check(this.treeView1.Nodes);
if (!repeatable)
{
TreeNode node = CreateChildNode();
TreeNode selectNode = this.treeView1.SelectedNode;
selectNode.Nodes.Add(node);
SaveToXml();
LoadFormXml();
}
}
}
}
以下是修改后的AddLowest_Click方法代码:
private void AddLowest_Click(object sender, EventArgs e)
{
AddLowest form = new AddLowest(this);
if (form.ShowDialog() == DialogResult.OK)
{
if (!string.IsNullOrEmpty(lowest))
{
repeatable = false; // 重置repeatable变量
Check(this.treeView1.Nodes);
if (!repeatable)
{
TreeNode node = CreateLowestNode();
TreeNode selectNode = this.treeView1.SelectedNode;
selectNode.Nodes.Add(node);
SaveToXml();
LoadFormXml();
}
}
}
}
repeatable变量的重置应在每次添加节点之前完成,否则下一次查重操作可能会受到上一次操作的影响。
该回答引用ChatGPT
private bool Check(TreeNodeCollection treeNodes)
{
bool result = false;
foreach (TreeNode treeNode in treeNodes)
{
if (treeNode.Text.Equals(unit) || treeNode.Text.Equals(user) || treeNode.Text.Equals(lowest))
{
treeNode.BackColor = Color.Red; //将节点的背景颜色设为红色
treeNode.Parent.Expand(); //展开父节点
result = true; //设置result为true,表示在三级节点中找到了该用户
}
if (treeNode.Nodes.Count > 0)
{
bool subResult = Check(treeNode.Nodes); //递归调用CheckUser,查找子节点中是否存在该用户
if (subResult)
{
result = true; //如果子节点中找到了该用户,将result设置为true
}
}
}
return result; //返回结果
}
private void AddArea_Click(object sender, EventArgs e)
{
//创建AddUser窗体的实例
AddUnit form = new AddUnit(this);
//显示窗体,等待用户输入
form.ShowDialog();
if (!string.IsNullOrEmpty(unit))
{
//检查Tree View控件中是否已经存在指定用户的节点
bool repeatable = Check(this.treeView1.Nodes);
if (repeatable)
{
//如果用户已经存在,弹出确认对话框
MessageBox.Show("[" + unit + "]已经存在");
}
else
{
//如果用户不存在,创建新的节点
TreeNode node = CreateRootNode();
this.treeView1.Nodes[0].Nodes.Add(node);
SaveToXml(); //重新从XML文件中加载数据并更新Tree View控件
LoadFormXml();
}
}
}
题主可以说一下具体的需求,这边给你提供正确的编码思路。