2011-07-20 39 views

回答

17

使用DataGridView的MouseDown事件来测试是否点击了鼠标右键,如果是,请使用关联的HitTestInfo属性确定是否单击了单元格,行或列。使用此信息显示您需要的ContextMenuStrip。

下面是一个例子MouseDown这样做的事件。尝试在表单上放置DataGridView和三个ContentMenuStrips。将ContentMenuStrips命名为mnuCell,mnuRow和mnuColumn。

Private Sub DataGridView1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseDown 
    If e.Button = Windows.Forms.MouseButtons.Right Then 
     Dim ht As DataGridView.HitTestInfo 
     ht = Me.DataGridView1.HitTest(e.X, e.Y) 
     If ht.Type = DataGridViewHitTestType.Cell Then 
      DataGridView1.ContextMenuStrip = mnuCell 
      mnuCell.Items(0).Text = String.Format("This is the cell at {0}, {1}", ht.ColumnIndex, ht.RowIndex) 
     ElseIf ht.Type = DataGridViewHitTestType.RowHeader Then 
      DataGridView1.ContextMenuStrip = mnuRow 
      mnuRow.Items(0).Text = "This is row " + ht.RowIndex.ToString() 
     ElseIf ht.Type = DataGridViewHitTestType.ColumnHeader Then 
      DataGridView1.ContextMenuStrip = mnuColumn 
      mnuColumn.Items(0).Text = "This is col " + ht.ColumnIndex.ToString() 
     End If 
    End If 
End Sub 

在这里,我分配在DataGridView的ContextMenuStrip属性到合适的ContextMenuStrip该项目右侧点击(单元格,行或列)。为了演示如何进一步自定义ContextMenuStrips的行为,我还设置了每个ContentMenuStrips菜单项中的文本。

+0

谢谢,我有三个contextmenu,一个用于行,列和单元格。我把这个行的contextmenu放在这行''这是行'',并且禁用了其他两个它仍然显示的行,但是当我点击一个单元格时它显示了行上下文菜单。 – Smith

+0

@史密斯我用我认为你需要的东西更新了我的例子。 –

1

在DataGridView的MouseDown事件上,使用DataGridView.HitTest方法检查点击的内容。然后,您可以根据点击的内容切换上下文菜单。