本人做了一個 DataGridVIEw用來顯示數據庫中的字段,為了能夠讓用戶可以自定義要顯示的字段,特加上右鍵菜單功能運行效果圖如下:

為了實現這個例子,必須完成下面要求:
1、能夠根據DataGridVIEw的列名動態生成菜單項
2、能夠選擇多個選項,保證菜單不消失
3、選擇完成後,根據菜單的選擇情況,控制DataGridVIEw的列的顯示
代碼如下:

Private Sub DataGridView1_GotFocus()Sub DataGridView1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridVIEw1.GotFocus

''動態生成菜單項的過程

With Me.DataGridVIEw1

''清除菜單項

Me.ContextMenuStrip1.Items.Clear()

''添加標題

Dim Menu_item1 As ToolStripMenuItem = New ToolStripMenuItem

Menu_item1.Text = "選擇顯示的字段"

Menu_item1.Enabled = False

Me.ContextMenuStrip1.Items.Add(Menu_item1)

''添加分割線

Dim fgx As ToolStripSeparator = New ToolStripSeparator

Me.ContextMenuStrip1.Items.Add(fgx)

''根據DataGridVIEw的列名稱添加菜單項

Dim i As Int16

For i = 0 To .ColumnCount - 1

Dim Menu_item As ToolStripMenuItem = New ToolStripMenuItem

Menu_item.Text = .Columns(i).HeaderText

Menu_item.Checked = .Columns(i).Visible

Me.ContextMenuStrip1.Items.Add(Menu_item)

Next

End With

End Sub



Private Sub ContextMenuStrip1_ItemClicked()Sub ContextMenuStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ContextMenuStrip1.ItemClicked

''點擊菜單項時,菜單項的選定狀態取反

''被點擊的菜單項為 e.ClickedItem

CType(e.ClickedItem, ToolStripMenuItem).Checked = Not CType(e.ClickedItem, ToolStripMenuItem).Checked


End Sub
$False$
Private Sub ContextMenuStrip1_Closing()Sub ContextMenuStrip1_Closing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripDropDownClosingEventArgs) Handles ContextMenuStrip1.Closing
''取消點擊選項就消失,這樣只有在菜單外的區域點擊菜單才會消失
''在此判斷引發時間的原因即“e.CloseReason”的值
If e.CloseReason.ToString = "ItemClicked" Then
e.Cancel = True
End If
End Sub

Private Sub ContextMenuStrip1_Closed()Sub ContextMenuStrip1_Closed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripDropDownClosedEventArgs) Handles ContextMenuStrip1.Closed
''關閉菜單時
把選定的結果應用到DataGridVIEw

Dim i As Int16

For i = 2 To Me.ContextMenuStrip1.Items.Count - 1

''這裡我們需要設置被點擊的菜單項(ToolStripMenuItem)的Checked狀態,但是我們不能直接通過Me.ContextMenuStrip1.Items(i).Checked的方式操作,必須把它進行類型轉換,同樣的情況見“ContextMenuStrip1.ItemClicked”

Me.DataGridVIEw1.Columns(Me.ContextMenuStrip1.Items(i).Text).Visible = CType(Me.ContextMenuStrip1.Items(i), ToolStripMenuItem).Checked()


Next

End Sub