在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之后触发,因此它获胜。典型的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);