C# 验证零级树状图中具有相同名称的节点
我正在重命名级别为0(A、B、C)的树节点(A到B),但B此时已存在于treeview中。我希望显示消息“名称已可用于父级。无法提供相同的名称。” 为此,我已经编写了上面的代码,但是当我给树中的任何子节点提供父节点名(比如“A”)时,它是不允许的。它应该允许的,因为父节点名可能在子节点中重复 更新代码……。C# 验证零级树状图中具有相同名称的节点,c#,winforms,treeview,C#,Winforms,Treeview,我正在重命名级别为0(A、B、C)的树节点(A到B),但B此时已存在于treeview中。我希望显示消息“名称已可用于父级。无法提供相同的名称。” 为此,我已经编写了上面的代码,但是当我给树中的任何子节点提供父节点名(比如“A”)时,它是不允许的。它应该允许的,因为父节点名可能在子节点中重复 更新代码……。 Tree | A-A1 -A2 | B-B1 -B2 -B3 | C-C1 -C2 p
Tree
|
A-A1
-A2
|
B-B1
-B2
-B3
|
C-C1
-C2
private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
foreach (TreeNode tn in treeView1.Nodes)
{
if (!tn.Equals(e.Node) && tn.Text.ToUpper() == e.Label.ToUpper() )
{
MessageBox.Show("Name already available for parent. Cannot give same name.", "Rename element");
e.CancelEdit = true;
return;
}
}
string l_strOldDisplayName = treeView1.SelectedNode.Text;
this.BeginInvoke(new Action(() => RenameTreeElement(l_strOldDisplayName, e.Node)));
treeView1.LabelEdit = false;
treeView1.SelectedNode.EndEdit(false);
}
private void RenameElement(string f_strOldDisplayName, TreeNode updatedNode)
{
foreach (TreeNode currentNode in treeView1.Nodes)
{
if (currentNode.Level == 0)
{
if (updatedNode.Text == currentNode.Text)
{
MessageBox.Show("Name already available for parent. Cannot give same name.", "Rename element");
return;
}
}
}
}
void treeView1_AfterLabelEdit(对象发送方,NodeLabelEditEventArgs e){
foreach(树节点中的树节点tn){
如果(!tn.Equals(e.Node)&&tn.Text==e.Label&&IsChildNodeHaveSameName(e.Label,e.Node)){
Show(“名称已在使用中”);
e、 CancelEdit=true;
}
}
}
私有bool IsChildNodeHaveSameName(字符串newName)
{//如果新的父节点名称位于子节点下,则跳过
foreach(Collect中的var节点(treeView1.Nodes))
{
if(node.Text.ToUpper()==newName.ToUpper())
{
返回true;
}
}
返回false;
}
IEnumerable收集(TreeNodeCollection节点)
{
foreach(节点中的树节点)
{
收益回报节点;
foreach(Collect中的var子节点(node.Nodes))
退换子女;
}
}
属性e.Label
提供用户正在浮动标签中写入的文本。这样,您就可以将代码简化为如下内容:
void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
foreach (TreeNode tn in treeView1.Nodes) {
if (!tn.Equals(e.Node) && tn.Text == e.Label&& !IsChildNodeHaveSameName(e.Label, e.Node)) {
MessageBox.Show("Name already in use.");
e.CancelEdit = true;
}
}
}
private bool IsChildNodeHaveSameName(string newName)
{//if new parent node name is under child node then skip
foreach (var node in Collect(treeView1.Nodes))
{
if (node.Text.ToUpper() == newName.ToUpper())
{
return true;
}
}
return false;
}
IEnumerable<TreeNode> Collect(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
yield return node;
foreach (var child in Collect(node.Nodes))
yield return child;
}
}
感谢您的回复,但当我给父节点名时,对树中的任何子节点都说“A”,这是不允许的。它应该允许,因为父节点名应该在树中重复children@John更新代码。听起来您只想在根笔记上进行此检查。
void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
if (e.Node.Level == 0) {
foreach (TreeNode tn in treeView1.Nodes) {
if (!tn.Equals(e.Node) && tn.Text == e.Label) {
MessageBox.Show("Name already in use.");
e.CancelEdit = true;
}
}
}
}