簡體   English   中英

通過 Sub Function 動態檢查 ToolStripMenuItem 中的項目

[英]Check the item in ToolStripMenuItem dynamically through Sub Function

我是 .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 列重新排列為以前的:

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 沒有被檢查。

實際上我需要函數/子,我將能夠傳遞網格名稱和菜單名稱並循環遍歷網格列並檢查該列是否可見或特定列是否可見然后我需要在 itemmenu 中檢查該項目.

我要求 sub / 功能,因為它可以用於任何形式的任何工具條菜單項。

感謝致敬。

根據@Jimi 的提示,使用 datagridview 列名稱分配每個必需的 Menuitem 的 Tag 屬性並創建以下子/函數:

 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:

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 列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM