在AfterLabelEdit期间无法在treeView中更改selectedNode

时间:2011-09-22 17:41:24

标签: c# winforms treeview treenode

我在树视图中遇到选定节点的问题。

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

1 - 如果我选择节点“级别”,请按F2,更改标签并按Enter键。 AfterLabelEdit中的selectedNode将发生变化。 selectedNode将从“Level1”更改为“Root”。

2 - 如果我选择节点“级别”,按F2,更改标签但单击树视图上的某个位置,selectedNode将永远不会更改。

引发问题的事件是否会被触发?

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

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

}

2 个答案:

答案 0 :(得分:3)

这是一个事件订单问题,鼠标点击 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();
        };
    }

有效,有点难看。这仅在用户单击特定节点时发生,您可能不应该覆盖该选项。重申代码btw的荣誉。

答案 1 :(得分:1)

有点黑客,但是当用户点击树视图中的其他位置时,这将选择根节点,但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);