Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证零级树状图中具有相同名称的节点_C#_Winforms_Treeview - Fatal编程技术网

C# 验证零级树状图中具有相同名称的节点

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

我正在重命名级别为0(A、B、C)的树节点(A到B),但B此时已存在于treeview中。我希望显示消息“名称已可用于父级。无法提供相同的名称。”

为此,我已经编写了上面的代码,但是当我给树中的任何子节点提供父节点名(比如“A”)时,它是不允许的。它应该允许的,因为父节点名可能在子节点中重复

更新代码……。

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;
      }
    }
  }
}