Avatar billede funkyloonie Nybegynder
08. september 2002 - 13:01 Der er 7 kommentarer og
1 løsning

Event på MenuItem

Jeg har en klasse som genererer menuen på en form dynamisk (da den er afhængig af hvilken bruger som er logget på). Klassen får formen med som parameter. Klassen har en attribut af typen menuItem som bruges til at generere alle punkter i menuen. Hvordan får jeg en click_event tilknyttet menupunkterne?
Avatar billede pelkjaer Nybegynder
08. september 2002 - 13:11 #1
Snakker vi <asp:listbox runat="server"></asp:listbox> ?

Hvis ja, så tror jeg ikke du kan sætte onclick på.
Avatar billede funkyloonie Nybegynder
08. september 2002 - 13:12 #2
Jeg glemte vist at sige at det er i vb .net jeg koder.
Avatar billede jakobandersen Nybegynder
08. september 2002 - 13:27 #3
Lav menupunkterne som linkbuttons
Avatar billede funkyloonie Nybegynder
08. september 2002 - 14:13 #4
hvad er fordelen ved linkbuttons? mit spg. går mere på hvordan jeg får eventen registreret...
Avatar billede jakobandersen Nybegynder
08. september 2002 - 14:16 #5
Du kan tilføje en onclick event til en linkbutton.

Kan du ikke vise os hvordan det ser ud nu?
Avatar billede funkyloonie Nybegynder
08. september 2002 - 14:23 #6
Her er min klasse. har fjernet properties for overskuelighedens skyld.
DynamicMenuItem arver fra MenuItem og indeholder kun en enkelt attribut som er et id der skal bruges i forbindelse med onclick proceduren.

Public Class DynamicMenu
    Private mtTree As MenuTree
    Private foForm As System.Windows.Forms.Form
    Private mmMainMenu = New System.Windows.Forms.MainMenu()
    Private miMenuItem As New DynamicMenuItem()
    Private colItems As New Collection()

    Sub New(ByVal menutree As MenuTree, ByVal mform As System.Windows.Forms.Form, ByVal cItems As Collection)
        mtTree = menutree
        foForm = mform
        foForm.Menu = mmMainMenu
        colItems = cItems

        CreateTree()
        CreateMenu()
        mtTree.SetRootAsCurrent()
    End Sub

#Region "CreateTree"
    Public Sub CreateTree()
        Dim i As Integer
        For i = 1 To colItems.Count Step 1
            mtTree.InsertItem(colItems.Item(i))
        Next
    End Sub
#End Region

#Region "CreateMenu"
    Private Sub CreateMenu()
        mtTree.SetRootAsCurrent()
        Dim item As Object
        Dim i As Integer

        For i = 1 To mtTree.CurrentNode.Children.Count Step 1
            If mtTree.CurrentNode.Child(i).Item.GetType.ToString.Equals("System.String") Then
                item = CType(mtTree.CurrentNode.Child(i).Item, String)
                With miMenuItem
                    .dMIId = 0
                    .Text = item
                End With
                mmMainMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
                Dim j As Integer
                For j = 1 To mtTree.CurrentNode.Child(i).children.count Step 1
                    CreateMenu(mtTree.CurrentNode.Child(i), miMenuItem)
                Next
            Else
                item = CType(mtTree.CurrentNode.Child(i).Item, Item)
                With miMenuItem
                    .dMIId = item.iId
                    .Text = item.iName
                End With
                mmMainMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
            End If
            miMenuItem = New DynamicMenuItem()
        Next
    End Sub


    Private Sub CreateMenu(ByVal curNode As GeneralTreeNode, ByVal curDynMenuItem As DynamicMenuItem)
        If curNode.Children.Count <> 0 Then
            Dim item As Object
            Dim i As Integer
            miMenuItem = New DynamicMenuItem()
            For i = 1 To curNode.Children.Count Step 1
                If curNode.Child(i).Item.GetType.ToString.Equals("System.String") Then
                    item = CType(curNode.Child(i).Item, String)
                    With miMenuItem
                        .dMIId = 0
                        .Text = item
                    End With

                    Dim j As Integer
                    For j = 0 To curDynMenuItem.MenuItems.Count Step 1
                        If (curDynMenuItem.MenuItems.Count <> 0) Then
                            If (curDynMenuItem.MenuItems.Item(j).ToString.Equals(miMenuItem.text) = False) Then
                                curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
                                Exit For
                            End If
                        Else
                            curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
                        End If
                    Next
                    CreateMenu(curNode.Child(i), miMenuItem)
                Else
                    item = CType(curNode.Child(i).Item, Item)
                    With miMenuItem
                        .dMIId = item.iId
                        .Text = item.iName
                    End With
                    curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
                End If
                miMenuItem = New DynamicMenuItem()
            Next
        End If
    End Sub
#End Region

End Class
Avatar billede funkyloonie Nybegynder
08. september 2002 - 14:24 #7
er der brug for andet kode så sig bare til :-)
Avatar billede funkyloonie Nybegynder
08. september 2002 - 15:36 #8
Jeg har selv løst problemet. En af menuitems konstruktører har en eventhandler som parameter. Jeg sender min sub procedure menuitem_click med til konstruktøren. Så har jeg løst mit problem. :) Tak for hjælpen. Jeg tager dog points selv da jeg selv løste mit problem. Her er klassen igen revideret hvis i skulle have lyst til at bruge den.

Public Class DynamicMenu
    Private mtTree As MenuTree
    Private foForm As System.Windows.Forms.Form
    Private mmMainMenu = New System.Windows.Forms.MainMenu()
    Private miMenuItem As New DynamicMenuItem()
    Private colItems As New Collection()

    Sub New(ByVal menutree As MenuTree, ByVal mform As System.Windows.Forms.Form, ByVal cItems As Collection)
        mtTree = menutree
        foForm = mform
        foForm.Menu = mmMainMenu
        colItems = cItems

        CreateTree()
        CreateMenu()
        mtTree.SetRootAsCurrent()
    End Sub

#Region "CreateTree"
    Public Sub CreateTree()
        Dim i As Integer
        For i = 1 To colItems.Count Step 1
            mtTree.InsertItem(colItems.Item(i))
        Next
    End Sub
#End Region

#Region "CreateMenu"
    Private Sub CreateMenu()
        mtTree.SetRootAsCurrent()
        Dim item As Object
        Dim i As Integer

        For i = 1 To mtTree.CurrentNode.Children.Count Step 1
            If mtTree.CurrentNode.Child(i).Item.GetType.ToString.Equals("System.String") Then
                item = CType(mtTree.CurrentNode.Child(i).Item, String)
                miMenuItem = New DynamicMenuItem(item, 0)
                mmMainMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
                Dim j As Integer
                For j = 1 To mtTree.CurrentNode.Child(i).children.count Step 1
                    CreateMenu(mtTree.CurrentNode.Child(i), miMenuItem)
                Next
            Else
                item = CType(mtTree.CurrentNode.Child(i).Item, Item)
                miMenuItem = New DynamicMenuItem(item.iName, item.iId, New EventHandler(AddressOf Me.MenuItem_Clicked))
                mmMainMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
            End If
        Next
    End Sub


    Private Sub CreateMenu(ByVal curNode As GeneralTreeNode, ByVal curDynMenuItem As DynamicMenuItem)
        If curNode.Children.Count <> 0 Then
            Dim item As Object
            Dim i As Integer
            For i = 1 To curNode.Children.Count Step 1
                If curNode.Child(i).Item.GetType.ToString.Equals("System.String") Then
                    item = CType(curNode.Child(i).Item, String)
                    miMenuItem = New DynamicMenuItem(item, 0)
                    Dim j As Integer
                    For j = 0 To curDynMenuItem.MenuItems.Count Step 1
                        If (curDynMenuItem.MenuItems.Count <> 0) Then
                            If (curDynMenuItem.MenuItems.Item(j).ToString.Equals(miMenuItem.Text) = False) Then
                                curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
                                Exit For
                            End If
                        Else
                            curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
                        End If
                    Next
                    CreateMenu(curNode.Child(i), miMenuItem)
                Else
                    item = CType(curNode.Child(i).Item, Item)
                    miMenuItem = New DynamicMenuItem(item.iName, item.iId, New EventHandler(AddressOf Me.MenuItem_Clicked))
                    curDynMenuItem.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {miMenuItem})
                End If
            Next
        End If
    End Sub
#End Region

#Region "Properties"
    Public Property MenuTree() As MenuTree
        Get
            Return mtTree
        End Get
        Set(ByVal Value As MenuTree)
            mtTree = Value
        End Set
    End Property

    Public Property Form() As System.Windows.Forms.Form
        Get
            Return foForm
        End Get
        Set(ByVal Value As System.Windows.Forms.Form)
            foForm = Value
        End Set
    End Property

    Public Property MainMenu() As System.Windows.Forms.MainMenu
        Get
            Return mmMainMenu
        End Get
        Set(ByVal Value As System.Windows.Forms.MainMenu)
            mmMainMenu = Value
        End Set
    End Property

    Public Property MenuItem() As System.Windows.Forms.MenuItem
        Get
            Return miMenuItem
        End Get
        Set(ByVal Value As System.Windows.Forms.MenuItem)
            miMenuItem = Value
        End Set
    End Property

    Public Property Items() As Collection
        Get
            Return colItems
        End Get
        Set(ByVal Value As Collection)
            colItems = Value
        End Set
    End Property

#End Region
    Private Sub MenuItem_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
        sender.dMIId()
        MsgBox("event " & sender.dMIId())
    End Sub
End Class
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester