有两种方案:
1.用TreeView的NodeMouseClick事件,动态生成ContextMenu,部分属性根据该事件的e.Node换取currentnode得到,但Debug时NodeMouseClick事件被触发两次,求解。
2.在TreeView上绑ContextMenuStrip控件,想通过TreeView的GetNodeAt来获取currentnode,但currentnode始终为空,求解。谢谢

解决方案 »

  1.   

    再右键菜单点击的事件处理函数中用((((sender as ToolStripMenuItem).Owner) as ContextMenuStrip).SourceControl)as TreeNode看看能不能获取到当前点击的节点
      

  2.   

    1.直接用MouseClick 事件
    2.贴代码
      

  3.   

    ContextMenuStrip cms = sender as ContextMenuStrip;
                TreeNode currNode = this.ProjectList.GetNodeAt(cms.Bounds.Location);
      

  4.   

    ContextMenuStrip cms = sender as ContextMenuStrip;
                TreeNode currNode = this.ProjectList.GetNodeAt(cms.Bounds.Location);    private void treeView_MouseDown(object sender, MouseEventArgs e)
            {
                TreeNode node = treeView2.GetNodeAt(e.X, e.Y);
             }
      

  5.   

    请问用用MouseClick 事件不用NodeMouseClick的原因是?
      

  6.   

    ContextMenuStrip cms = sender as ContextMenuStrip;
                TreeNode currNode = this.ProjectList.GetNodeAt(cms.Bounds.Location);    private void treeView_MouseDown(object sender, MouseEventArgs e)
            {
                TreeNode node = treeView2.GetNodeAt(e.X, e.Y);
             }
    我前面的代码是ContextMenu的Opening事件,这边获取node是想判断是否让右键菜单显示出来,e没法获取location,只好用sender as ContextMenuStrip里的location。
    如果我用MouseDown方法,确实可以获取到node,那看来要ContextMenu在事件中动态生成,来满足我只有叶子节点被选中才显示菜单的需求?
      

  7.   

    ContextMenuStrip cms = sender as ContextMenuStrip;
                TreeNode currNode = this.ProjectList.GetNodeAt(cms.Bounds.Location);    private void treeView_MouseDown(object sender, MouseEventArgs e)
            {
                TreeNode node = treeView2.GetNodeAt(e.X, e.Y);
             }
    我前面的代码是ContextMenu的Opening事件,这边获取node是想判断是否让右键菜单显示出来,e没法获取location,只好用sender as ContextMenuStrip里的location。
    如果我用MouseDown方法,确实可以获取到node,那看来要ContextMenu在事件中动态生成,来满足我只有叶子节点被选中才显示菜单的需求?本来就应该选中才显示ContextMenu,
      

  8.   

    ContextMenuStrip cms = sender as ContextMenuStrip;
                TreeNode currNode = this.ProjectList.GetNodeAt(cms.Bounds.Location);    private void treeView_MouseDown(object sender, MouseEventArgs e)
            {
                TreeNode node = treeView2.GetNodeAt(e.X, e.Y);
             }
    我前面的代码是ContextMenu的Opening事件,这边获取node是想判断是否让右键菜单显示出来,e没法获取location,只好用sender as ContextMenuStrip里的location。
    如果我用MouseDown方法,确实可以获取到node,那看来要ContextMenu在事件中动态生成,来满足我只有叶子节点被选中才显示菜单的需求?本来就应该选中才显示ContextMenu,
    我绑定在Treeview上, 不管点在Treeview哪里都显示,我只希望在选中叶子节点的时候才显示
      

  9.   

    SourceControl类型是TreeView 取不到TrreeNode
      

  10.   

    解决了 用MouseDown事件改变selectedNode,在配合ContextMenuStrip的Opening事件来判断是否显示右键菜单,取到了currentNode,就简单了