每当我在树节点文本外部单击时,控制部分就会发生节点单击事件,但不会突出显示该节点。我不确定为什么会这样。
我希望在点击时选择节点 - 当您单击节点文本时 - 而不是空格 - 我只假设节点宽度跨越整个Treenode?我在dock.fill模式下有树视图,如果它与它有关 - 我尝试了一切,但不能让它行为正常。
也许有人会知道发生了什么。
更新:
if (e.Location.IsEmpty)
{
似乎工作得更好 - 但仍然在没有文本的空白处选择节点 - 显然节点宽度在整个树视图中都是如此?
有没有更好的方法来实现我想要的?或者这是最好的方式?
更新:以前的想法不起作用 - 我认为它做到了,但事实并非如此。
新问题:我认为当我从treeview切换时,问题的一部分与焦点有关。
UPDATE -
我提出的关于禁用鼠标右键单击以选择onSelect事件上的节点的唯一代码是
if (MouseButtons == System.Windows.Forms.MouseButtons.Right)
{
e.Cancel = true;
}
但它不起作用 - 任何帮助都表示赞赏 - 只有答案的建议,更多细节。
答案 0 :(得分:3)
您应该使用treeView.HitTest方法来确定单击节点的哪个部分。
private bool IsClickOnText(TreeView treeView, TreeNode node, Point location)
{
var hitTest = treeView1.HitTest(location);
return hitTest.Node == node
&& hitTest.Location == TreeViewHitTestLocations.Label;
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if(IsClickOnText(treeView1, e.Node, e.Location))
{
MessageBox.Show("click");
}
}
private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if (e.Action == TreeViewAction.ByMouse)
{
var position = treeView1.PointToClient(Cursor.Position);
e.Cancel = !IsClickOnText(treeView1, e.Node, position);
}
}
答案 1 :(得分:0)
使用.AfterSelect和/或.BeforeSelect事件来处理选择处理而不是.Click事件。然后它将仅在您单击文本时选择节点,并且它不会触发.AfterSelect或.BeforeSelect当您单击空白区域时。