是不是应该在treeview的mouse_down 事件里判断呢?
如果是,那怎么让contextMenu不弹出来呢?

解决方案 »

  1.   

    http://www.syncfusion.com/FAQ/WinForms/FAQ_c91c.asp#q1097qPoint ClickPoint = new Point(e.X,e.Y); 
     
    TreeNode ClickNode = treeView1.GetNodeAt(ClickPoint); //save ClickNode somewhere
      

  2.   

    You can display a context menu when a user right-clicks on a node by listening to the TreeView's MouseUp event as shown below: 
     
    [C#] 
     
    private void treeView1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
     

     
         if(e.Button == MouseButtons.Right) 
     
         { 
     
              Point ClickPoint = new Point(e.X,e.Y); 
     
              TreeNode ClickNode = treeView1.GetNodeAt(ClickPoint); 
     
              if(ClickNode == null) return; 
     
              // Convert from Tree coordinates to Screen coordinates 
     
              Point ScreenPoint = treeView1.PointToScreen(ClickPoint); 
     
              // Convert from Screen coordinates to Formc coordinates 
     
              Point FormPoint = this.PointToClient(ScreenPoint); 
     
              // Show context menu 
     
              contextmenu.MenuItems.Clear(); 
     
              contextmenu.MenuItems.Add("Item1"); 
     
              contextmenu.MenuItems.Add("Item2"); 
     
              contextmenu.Show(this,FormPoint); 
     
         } 
     

     
      

  3.   

    在MouseDown事件里
    TreeNode tn =this.tree .GetNodeAt(e.X,e.Y) as TreeNode;
    if(tn == null)
    {
      for(int i=0;i<this.tree.ContextMenu.MenuItems.Count;i++)
    {
    this.tree.ContextMenu.MenuItems[i].Visible = false;
    }
      return ;
    }
    else
    {
      //选中当前节点
      this.tree .SelectedNode = tn;
      for(int i=0;i<this.tree.ContextMenu.MenuItems.Count;i++)
    {
    this.tree.ContextMenu.MenuItems[i].Visible = true;
    }
    }
      

  4.   

    private void treeView1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Right)
                {
                    TreeNode tn = this.treeView1.GetNodeAt(e.X, e.Y);
                    if (tn != null)
                    {
                        this.contextMenu.Show(this.treeView1,e.Location);
                    }
                }
            }
      

  5.   

    添加如下的代码就可以了:
    private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if (treeView1.GetNodeAt(e.X,e.Y)!=null)
    {
    this.treeView1.ContextMenu = this.contextMenu1;
    }
    else
    {
    this.treeView1.ContextMenu = null;
    }
    }
      

  6.   

    这是我今天写的一个测试用的:
    #region  TreeView的事件操作
    private void OnTreeViewAfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {

    switch(e.Node.Text)
    {
    case "Folder":
    MessageBox.Show(this,e.Node.Text);
    break;
    case "Friend":
    str_flag ="f";
    break;
    case "Relative":
    str_flag ="r";
    break;
    case "":
    str_flag="";
    break;
    default:
    str_flag="";
    break;
    }
    }
    private void OnTreeViewMenuMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {

    if(e.Button == MouseButtons.Right)
    {
    switch(str_flag)
    {
    case "f":
    case "r":
    this.contextMenu1.Show(this.treeView1,(new Point(e.X,e.Y)));
    break;
    default:
    break;
    }

    }
    }
    #endregion
      

  7.   

    private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    if (treeView1.GetNodeAt(e.X,e.Y)!=null)
    {this.treeView1.ContextMenu = this.contextMenu1;}
    else{this.treeView1.ContextMenu = null;}
    }