如何防止 TreeView 重命名重复

How to prevent TreeView rename from making a duplicate

我看到很多帖子都在问类似的问题,但 none 似乎回答了这个问题。我有一个像这样的供应商的 TreeView:

Soda
    Regular
        SmallCan
        SmallBottle
    Diet
        SmallCan
Water
    Regular
        EcoBottle

我创建了一个允许用户重命名所选节点的上下文菜单,但找不到强制执行的方法,如果它创建了重复的节点名称,要么拒绝更改,要么将节点文本还原为之前的价值。这是上下文更改事件和处理强制执行的方法:

private void contextMenuRename_Click(object sender, System.EventArgs e)
{
    restoreNode = treProducts.SelectedNode;
    treProducts.LabelEdit = true;
    if (!treProducts.SelectedNode.IsEditing)
    {
        treProducts.SelectedNode.BeginEdit();
    }
    enforceNoTreeDuplicates();
}


private void enforceNoTreeDuplicates()
{
    nodeNames.Clear();
    if (treProducts.SelectedNode.Level != 0)
    {
        foreach (TreeNode node in treProducts.SelectedNode.Parent.Nodes)
        {
            nodeNames.Add(node.Text);
        }
    }
    else
    {
        foreach (TreeNode node in treProducts.Nodes)
        {
            nodeNames.Add(node.Text);
        }
    }
    int countDuplicates = 0;
    foreach (string nodeName in nodeNames)
    {
        if (restoreNode.Text == nodeName)
        {
            countDuplicates++;
        }
        if (countDuplicates > 1)
        {
            treProducts.SelectedNode = restoreNode;
        }

    }
}

但是,如果其中有 enforceNoTreeDuplicates() 方法,BeginEdit() 似乎不会 运行。是否有更好的方法来处理所选节点的编辑,或者 enforceNoTreeDuplicates() 方法有问题?

通常,您会为此使用 AfterLabelEdit,它具有取消编辑的选项:

void treProducts_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
  foreach (TreeNode tn in e.Node.Parent.Nodes) {
    if (tn.Text == e.Label) {
      e.CancelEdit = true;
    }
  }
}