在AfterLabelEdit期间无法更改树视图中的selectedNode

本文关键字:视图 selectedNode AfterLabelEdit | 更新日期: 2023-09-27 18:09:29

我在树视图中选择节点有问题。

这里有两个场景。(# 2导致了我的问题)

1 -如果我选择节点"level",按F2,改变标签并按enter。AfterLabelEdit中的selectedNode将会改变。被选中的节点将从"Level1"变为"Root"。

2 -如果我选择节点"level",按F2,改变标签,但点击树视图上的某个地方,所选择的节点将永远不会改变。

是否触发了导致问题的事件?

我已经创建了一个小的测试项目来显示手头的问题。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.Load += new EventHandler(Form1_Load);
        this.treeView1.KeyDown += new KeyEventHandler(Form1_KeyDown);
        this.treeView1.AfterLabelEdit += new NodeLabelEditEventHandler(treeView1_AfterLabelEdit);
    }
void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
    Console.WriteLine(this.treeView1.SelectedNode);
    this.treeView1.SelectedNode = this.treeView1.SelectedNode.Parent;
    Console.WriteLine(this.treeView1.SelectedNode);
    TreeNode test = this.treeView1.SelectedNode;
}
void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (this.treeView1.SelectedNode != null)
    {
        if (e.KeyData == Keys.F2)
        {
            this.treeView1.SelectedNode.BeginEdit();
        }
    }
    base.OnKeyDown(e);
}
void Form1_Load(object sender, EventArgs e)
{
    this.treeView1.Nodes.Add(new TreeNode("root"));
    this.treeView1.Nodes[0].Nodes.Add(new TreeNode("level1"));
    this.treeView1.Nodes[0].Nodes[0].Nodes.Add(new TreeNode("level2"));
    this.treeView1.SelectedNode = this.treeView1.Nodes[0];
    this.treeView1.SelectedNode.ExpandAll();
    this.treeView1.SelectedNode = this.treeView1.Nodes[0].Nodes[0];
}

}

在AfterLabelEdit期间无法更改树视图中的selectedNode

这是一个事件顺序问题,鼠标单击在 AfterLabelEdit之后触发,因此它获胜。典型的BeginInvoke技巧不起作用,您需要一个Timer来选择节点:

    void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) {
        TreeNode nextnode = this.treeView1.SelectedNode.Parent;
        var timer = new Timer() { Enabled = true, Interval = 50 };
        timer.Tick += delegate {
            this.treeView1.SelectedNode = nextnode;
            timer.Dispose();
        };
    }

可以,有点丑。这只发生在用户单击特定节点时,也许您不应该覆盖该选择。为repro代码致敬,btw。

有点像一个hack,但是这将选择根节点当用户点击树视图中的其他地方,除了level2节点:

private bool SelectParent = false;
void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
    this.treeView1.SelectedNode = e.Node.Parent;
    SelectParent = true;
}
    private void treeView1_MouseDown(object sender, MouseEventArgs e)
    {
        if (SelectParent)
        {
            this.treeView1.SelectedNode = this.treeView1.SelectedNode.Parent;
            SelectParent = false;
        }
    }

将其放入form1构造函数中:

    this.treeView1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseDown);