我在树视图中遇到选定节点的问题。
这是两个场景。 (#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];
}
}
答案 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);