请问在TreeView的节点上按下鼠标右键开启contenxMenu, 但不允许在TreeView的空白处具有contenxMenu的功能, 请问该怎么做?

解决方案 »

  1.   

    没必要这样限制,你只需要在菜单弹出或者响应事件,检查是否当前选择了有效的TreeItem,再做处理。
      

  2.   

    做不到这样的功能吗? 还是我的问题不够清楚?
    换个方式问好了, 在TreeView上最末端的节点与中间节点具有不同的contextMenu内容, 就好像档案总管一样, 以鼠标右键点选数据夹和点选档案以及在空白处出现的选单内容是都不一样的.
    如果是以TreeView的ContextMenu属性加入contexMenu,那么是在TreeView的任何一个区域都是展现出同一个contexMenu, 那么我要怎么判断鼠标到底是点在那个位置而出现不同的选单呢?
      

  3.   

    我原本打算在OnMouseDown事件中做动态加载不同的contextMenu, 但在OnMouseDown中我不知道怎么去判断鼠标是否点在节点之上, 但如果是写在AfterSelect事件中的话, 这个事件是鼠标左键所触发的也不对, 有人知道到底该怎么做吗?
      

  4.   

    你判断好了以后contextmenu.show()就行啊
      

  5.   

    我现在的做法是先放两个contextMenu1和contextMenu2
    然后在MouseDown中
    private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
      if(e.Button==MouseButtons.Right){
        if(treeView1.GetNodeAt(e.X,e.Y)!=null){
          if(treeView1.SelectedNode.Parent!=null){
    treeView1.ContextMenu=contextMenu1;
          }else{
    treeView1.ContextMenu=contextMenu2;
          }
        }
      }
    }
    当判断右键点选的节点没有父节点时加载contextMenu1否则加载contextMenu2
    但是这样的做法有个大问题
    treeView1.SelectedNode不理会右键的选择, 必须先以左键点选后再以右键点选请问该怎么做才对呢?
      

  6.   

    if(treeView1.SelectedNode!=null)
    {
      ......
    }
      

  7.   

    使用
    if(treeView1.SelectedNode!=null)
    {
      ......
    }
    一旦有选择了某一个节点, 会在treeView的空白区域仍对contextMenu有效, 用我之前的判断式才能避免我现在的问题在于SelectedNode无法被鼠标右键触发, 必须先以左键点选后使SelectedNode更新为
    新的节点再以右键点选才有效, 但这样会引发一个问题, 因为使用者以鼠标左右键点选时在视觉上
    并没有什么不同, 但却会造成节点判断错误而开启错误的选单.
      

  8.   

    private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    TreeNode newSelectedNode;
    newSelectedNode = treeView1.GetNodeAt(e.X, e.Y);
    if (newSelectedNode != null)
    {
        treeView1.SelectedNode = newSelectedNode;
    }
    }
    这样右键鼠标点击节点后就没有问题
      

  9.   

    我觉得把OnRightClick事件放在节点上应该可以,不过就是代码量多一点而已