本人做了一个 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
'动态生成菜单项的过程
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