vb.net - 通过 Sub Function 动态检查 ToolStripMenuItem 中的项目
问题描述
我是 .Net Visual Basic 的新手,我目前正在自学并尝试制作一些小型应用程序。
我需要有关检查子菜单项的帮助ToolStripMenuItem
完整的概念是这样的:
我有一个datagridview,用户可以在其中重新排列列或使列可见或隐藏为此我有如下子/函数:
Public Sub Fun_Grid_Colomn_Visibility(ByVal GridName As DataGridView, ByRef ColName As String, ByVal MS_col As ToolStripMenuItem, ChkVal As Boolean)
If ChkVal = True Then
With GridName
.Columns("" & ColName & "").Visible = False
End With
MS_col.Checked = False
Exit Sub
End If
If ChkVal = False Then
GridName.Columns("" & ColName & "").Visible = True
MS_col.Checked = True
Exit Sub
End If
End Sub
在表单关闭时,我将保存用户网格格式,如下所示(从另一个 Q/A 帖子中获取代码):
Public Sub WriteGrideViewSetting(ByVal dgv As DataGridView, ByVal FileName As String)
Dim settingwriter As XmlTextWriter = New XmlTextWriter("C:\Users\<username>\Desktop\temp\" & FileName & ".xml", Nothing)
settingwriter.WriteStartDocument()
settingwriter.WriteStartElement(dgv.Name)
Dim count As Integer = dgv.Columns.Count
For i As Integer = 0 To count - 1
settingwriter.WriteStartElement("column")
settingwriter.WriteStartElement("Name")
settingwriter.WriteString(dgv.Columns(i).Name)
settingwriter.WriteEndElement()
settingwriter.WriteStartElement("width")
settingwriter.WriteString(dgv.Columns(i).Width.ToString())
settingwriter.WriteEndElement()
settingwriter.WriteStartElement("headertext")
settingwriter.WriteString(dgv.Columns(i).HeaderText)
settingwriter.WriteEndElement()
settingwriter.WriteStartElement("displayindex")
settingwriter.WriteString(dgv.Columns(i).DisplayIndex.ToString())
settingwriter.WriteEndElement()
settingwriter.WriteStartElement("visible")
settingwriter.WriteString(dgv.Columns(i).Visible.ToString())
settingwriter.WriteEndElement()
settingwriter.WriteEndElement()
Next
settingwriter.WriteEndElement()
settingwriter.WriteEndDocument()
settingwriter.Close()
End Sub
End Module
如果用户重新打开表单,我使用以下(Q/A 代码)将 Datagridview 列重新排列为 pervious :
Public Sub ReadDataGridViewSetting(ByVal dgv As DataGridView, ByVal FileName As String, ByRef Frm_name As Form)
Dim xmldoc As XmlDocument = New XmlDocument()
Dim xmlnode As XmlNodeList
Dim CMSN_ToolName As String
Dim Var_file_Chk As String = "C:\Users\<user>\Desktop\temp\" & FileName & ".xml"
If System.IO.File.Exists(Var_file_Chk) = True Then
Dim fs As FileStream = New FileStream(Var_file_Chk, FileMode.Open, FileAccess.Read)
xmldoc.Load(fs)
xmlnode = xmldoc.GetElementsByTagName("column")
For i As Integer = 0 To xmlnode.Count - 1
Dim columnName As String = xmlnode(i).ChildNodes.Item(0).InnerText.Trim()
Dim width As Integer = Integer.Parse(xmlnode(i).ChildNodes.Item(1).InnerText.Trim())
Dim headertext As String = xmlnode(i).ChildNodes.Item(2).InnerText.Trim()
Dim displayindex As Integer = Integer.Parse(xmlnode(i).ChildNodes.Item(3).InnerText.Trim())
Dim visible As Boolean = Convert.ToBoolean(xmlnode(i).ChildNodes.Item(4).InnerText.Trim())
dgv.Columns(columnName).Width = width
dgv.Columns(columnName).HeaderText = headertext
dgv.Columns(columnName).DisplayIndex = displayindex
dgv.Columns(columnName).Visible = visible
Next
fs.Close()
End If
End Sub
现在我需要的是 Itemmenu 的 Function 或 Sub。如果特定列在 datagridview 中可见,则应选中特定的 Itemmenu,否则将不选中。显示/打开 Itemmenu 时我需要此功能。
我在Itemmenu打开中尝试的(示例)就像
Private Sub ColumnsToolStripMenuItem_DropDownOpening(sender As Object, e As EventArgs) Handles ColumnsToolStripMenuItem.DropDownOpening
If DGV_CompList.Columns("DGC_Est").Visible = True Then
Dim CMSN_ToolName = MS_CV_Est.Name
Dim unused As ToolStripMenuItem = New ToolStripMenuItem(CMSN_ToolName) With {
.Checked = True
}
End If
End Sub
- DGV_CompList -> DataGridView
- DGC_Est -> datagridview 的列名
- MS_CV_Est -> - 需要检查的 ToolStripMenuItem(注意:我将更改 MenuItem 名称以匹配同步的 Datagrid 列名称)
但是 ToolStripMenuItem 没有得到检查。
实际上我需要函数/子,我将能够传递网格名称和菜单名称并循环遍历网格列并检查列是否可见,如果特定列可见,那么我需要检查 itemmenu 中的那个项目.
我要求 sub / 功能,因为它可以用于任何形式的任何工具条菜单。
谢谢并恭祝安康。
解决方案
根据@Jimi 的提示,为每个必需的 Menuitem 的 Tag 属性分配了 datagridview 列名,并创建了以下子/函数:
Public Sub Fun_ToolStripMenuItem_Check(ByVal dgv As DataGridView, ByVal TS_Menu_Items As ToolStripItemCollection)
For Each item As ToolStripMenuItem In TS_Menu_Items.OfType(Of ToolStripMenuItem)
If Not item.Tag = "" Then
If dgv.Columns(item.Tag).Visible = True Then
item.Checked = True
Else
item.Checked = False
End If
End If
For Each submenu_item As ToolStripMenuItem In item.DropDownItems.OfType(Of ToolStripMenuItem)
If Not submenu_item.Tag = "" Then
If dgv.Columns(submenu_item.Tag).Visible = True Then
submenu_item.Checked = True
Else
submenu_item.Checked = False
End If
End If
Next
Next
End Sub
请注意使用的循环 - “OfType(Of ToolStripMenuItem)”,因为我在 Itemmenus 之间有 ToolStripSeparator。
在鼠标悬停时调用 Sub by :
Private Sub MS_ColumnVisible_DropDownOpening(sender As Object, e As EventArgs) Handles MS_ColumnVisible.DropDownOpening
Fun_ToolStripMenuItem_Check(DGV_CompList, MS_CompDGV.Items)
End Sub
'DGV_CompList' - Datagridview 名称和 'MS_CompDGV' - ContextMenuStrip 名称
更重要的是,我没有为未使用的 Menuitems 的 Tag 属性分配任何值,显示或隐藏 datagridview 列。
推荐阅读
- react-native - 将本地图像处理到应用程序中 - 得到 sha1 错误
- r - 将时间格式列转换为数字 R
- c# - Hide mouse cursor when mouse cursor interacts with application
- python - 带有自定义类实例的 operator.index
- python - Jupyter Notebook Python 错误:return_type
- java - Webflux生产者消费者问题(webClient)
- python - python中奇怪的浮点到整数转换问题
- css - Facebook 分享按钮右对齐
- c++ - 找不到make,我该如何解决?
- excel - VBA中的递归序列