Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改发生在鼠标单击两次之后,而更改应该发生在单击一次之后_C#_Winforms_Treeview_Mouseevent_Selection - Fatal编程技术网

C# 更改发生在鼠标单击两次之后,而更改应该发生在单击一次之后

C# 更改发生在鼠标单击两次之后,而更改应该发生在单击一次之后,c#,winforms,treeview,mouseevent,selection,C#,Winforms,Treeview,Mouseevent,Selection,我有一个c windows窗体应用程序,其中tabControl的tabPage中有一个treeView,它是主窗体的一部分 对于树状视图,我单击要选择的树状视图的项目,然后根据我选择的项目进行一些更改 我使用AfterSelect事件选择项目,使用mouseUp事件取消选择 项目选择和取消选择立即发生,只需单击一次没有问题。其他更改应基于所选项目在单击两次后进行!在项目节点上或节点区域外单击不会触发此更改。我必须再次单击才能看到更改。那是有线的。我没有使用鼠标双击事件来进行此操作或类似操作,我

我有一个c windows窗体应用程序,其中tabControl的tabPage中有一个treeView,它是主窗体的一部分

对于树状视图,我单击要选择的树状视图的项目,然后根据我选择的项目进行一些更改

我使用AfterSelect事件选择项目,使用mouseUp事件取消选择

项目选择和取消选择立即发生,只需单击一次没有问题。其他更改应基于所选项目在单击两次后进行!在项目节点上或节点区域外单击不会触发此更改。我必须再次单击才能看到更改。那是有线的。我没有使用鼠标双击事件来进行此操作或类似操作,我只是使用上面描述的事件

这怎么会发生?如何解决呢?谢谢

编辑:我正在使用我自己的树视图的多选版本,并且我使用调试发现,当我在第一次单击后在AfterSelect事件中获得树的选定节点为零时,则是第二次单击的选定节点数。为什么每次单击树视图的overrided OnAfterSelect事件时,都会将所选节点添加到当前的selectedNodes列表中时会发生这种情况

以下是树视图代码的一部分:

public List<TreeNode> SelectedNodes
        {
            get
            {
                return selectedNodes; 
            }

            set
            {
                removeSelectionFromNodes();
                selectedNodes = value;
                selectNodes();
            }
        }

   protected override void OnAfterSelect(TreeViewEventArgs e)
        {
            base.OnAfterSelect(e); 
            base.SelectedNode = null;
           List<MSTreeNode> nodes = new List<MSTreeNode>();
                   .
                   .
                   .
               removeSelectionFromNodes();
                selectedNodes.Clear();
                selectedNodes.AddRange(nodes);
                selectNodes();
        }

也许Treeview在点击之间失去了焦点。您可以尝试将Treeview HideSelection属性设置为False,以便在控件失去焦点时突出显示当前选定的项目。

我尝试使用MouseDown事件而不是AfterSelect事件。我在我自己的treeView的多选版本中覆盖了它,并在我正在开发的c应用程序中使用了它,但它仍然不起作用。我不确定鼠标事件到底是如何工作的。如果不小心使用,您可能会看到有线行为

我最终覆盖了我的treeView子类中的MouseUp和MouseUp事件,然后创建了一个事件来侦听selectedNodes列表中的更改。如果在任何鼠标事件中对所选节点进行更改,则会触发此事件。然后,我在应用程序中使用treeview实例的ChangedSelectedNodes事件处理程序在节点选择发生更改时进行其他更改。这一次,一切如期进行

我发布这篇文章是希望它能对像我一样遇到同样问题的人有所帮助


附言:有时候事情并不像你期望的那样,你只是在努力和尝试其他的可能性,直到你找到解决方案

禁用隐藏选择选项并使用afterSelect选项
在我的工作良好的项目中

这是鼠标捕获的副作用,Control.capture属性。从描述中完全不清楚这是怎么发生的。发布代码段。将Treeview HideSelection属性设置为False无效