如何防止 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;
}
}
}
我看到很多帖子都在问类似的问题,但 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;
}
}
}