本人做了一個 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
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