【问题标题】:Check the item in ToolStripMenuItem dynamically through Sub Function通过 Sub Function 动态检查 ToolStripMenuItem 中的项目
【发布时间】:2020-10-16 10:26:56
【问题描述】:

我是 .Net Visual Basic 的新手,我目前正在自学并尝试制作一些小型应用程序。

我在检查ToolStripMenuItem 的子菜单项方面需要帮助

完整的概念是这样的:

我有一个数据网格视图,用户可以在其中重新排列列或使列可见或隐藏为此我有如下子/函数:

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 列重新排列为以前的:

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
  1. DGV_CompList -> DataGridView
  2. DGC_Est -> datagridview 的列名
  3. MS_CV_Est -> - 需要检查的 ToolStripMenuItem (注意:我将更改 MenuItem 名称以匹配同步的 Datagrid 列名称)

但未检查 ToolStripMenuItem。

实际上我需要函数/子,我将能够传递网格名称和菜单名称并循环遍历网格列并检查列是否可见如果特定列可见,那么我需要检查该项目在项目菜单中。

我请求子/功能,因为它可以用于任何形式的任何工具条菜单。

感谢和问候。

【问题讨论】:

  • 既然MS_CV_Est是一个ToolStripMenuItem,你为什么不直接设置MS_CV_Est.Checked = true呢?
  • @Jimi,如果我错过了这里的任何内容,我很抱歉。我需要一个通用的 Sub / Function 来检查子菜单项。过程就像我将遍历 datagridview 列,如果列是可见的,那么我会将菜单设置为选中状态。对于子/函数,我将传递 DGV 名称,这将有助于循环过程。我认为我们可以为任何以不同形式提供的菜单项重用相同的子/功能。
  • 嗯,这在您发布的代码中根本不清楚。如何将特定的 DataGridView 列关联到特定的 ToolStripMenuItem?属于哪个顶级父对象的菜单项?
  • @Jimi,我已经更新了问题。请您现在检查一下,看看请求是否明确。谢谢!!感谢您宝贵的时间
  • 我提出的任何一个问题都没有答案,请再次阅读我之前的评论。这与您正在使用的工具有关。例如,您是否将 ContextMenuStrip 关联到这些列?这些菜单项何时/如何构建?你知道数据绑定是如何工作的(如何绑定两个对象的属性)吗?或者,你知道如何使用 UI 对象的 Tag 属性吗?

标签: vb.net winforms


【解决方案1】:

根据@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 列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2010-12-02
    • 2022-06-15
    相关资源
    最近更新 更多