---
title: "MenuItem + addHandler"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/144709-menuitem-addhandler"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "ironhead"
published: "2006-03-28T20:02:48.000Z"
updated: "2006-03-30T18:38:50.000Z"
replies: 7
views: 611
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/144709-menuitem-addhandler"
---

# MenuItem + addHandler

## #1 — ironhead, 2006-03-28T20:02Z

Hoy!

Jag läser in menyitems från en xml-fil för att fylla en ContextMenu med:

```
'loop
ContextMenu1.MenuItems.Add(reader.ReadString, AddressOf MainMenu1_Click)
```

Antalet element varierar.
Just nu så hänvisas alla klickevents till "MainMenu1_Click".
Hur kan man hämta upp vilket val man klickade på och ha ett event för just det valet?

Permalänk: https://www.webforum.nu/p/144709

## #2 — ironhead, 2006-03-29T12:39Z

Gör såhär nu...kollar position på menyelement...känns inte bra att göra så :(

```
    Private Sub MainMenu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim mnuT As MenuItem
        mnuT = sender
        Dim position As String = mnuT.Index
        With mnuT
            Select Case position
                Case "0" 
			' Val 1
                Case "1"
			' Val 2
                Case Else
                    MsgBox("Någonting annat" & position)
            End Select
        End With
    End Sub
```

Hur ska man gå tillväga?
Annat sätt att läsa in menyelement dynamiskt?
Vill bara kunna styra onclick_eventet till en händelse...dynamiskt

Inläsningen av menyelementen

```
    Private Sub ReadXML(ByVal UrlToXmlFile As String)
        Dim reader As XmlTextReader = Nothing

            reader = New XmlTextReader(UrlToXmlFile)
		Dim name As Object = reader.NameTable.Add("name")
           While reader.Read

                If (reader.NodeType = XmlNodeType.Element) Then
                    If reader.Name.Equals(name) Then 'menyelement
                        ContextMenu1.MenuItems.Add(reader.ReadString, AddressOf MainMenu1_Click)
                    End If
                End If
            End While
     End Sub
```

Permalänk: https://www.webforum.nu/p/1788386

## #3 — Phorpher, 2006-03-29T15:02Z

> **ironhead skrev:**
>
> Gör såhär nu...kollar position på menyelement...känns inte bra att göra så :(
>
>
> ```
>     Private Sub MainMenu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
>         Dim mnuT As MenuItem
>         mnuT = sender
>         Dim position As String = mnuT.Index
>         With mnuT
>             Select Case position
>                 Case "0" 
> 			' Val 1
>                 Case "1"
> 			' Val 2
>                 Case Else
>                     MsgBox("Någonting annat" & position)
>             End Select
>         End With
>     End Sub
> ```
>
> 
> Hur ska man gå tillväga?
> Annat sätt att läsa in menyelement dynamiskt?
> Vill bara kunna styra onclick_eventet till en händelse...dynamiskt
> 
> Inläsningen av menyelementen
>
>
> ```
>     Private Sub ReadXML(ByVal UrlToXmlFile As String)
>         Dim reader As XmlTextReader = Nothing
> 
>             reader = New XmlTextReader(UrlToXmlFile)
> 		Dim name As Object = reader.NameTable.Add("name")
>            While reader.Read
> 
>                 If (reader.NodeType = XmlNodeType.Element) Then
>                     If reader.Name.Equals(name) Then 'menyelement
>                         ContextMenu1.MenuItems.Add(reader.ReadString, AddressOf MainMenu1_Click)
>                     End If
>                 End If
>             End While
>      End Sub
> ```

En variant är att helt enkelt kolla namnet på den MenuItem som skickade eventet. Inte världens snyggaste men det fungerar.

```
if(((MenuItem)sender).Text == "Val1")
...
```

En annan variant kan vara att spara ett Guid tillsammans med varje menyalternativ i XML-filen. När du läser in menyalternativen och genererar MenuItems så lägger du det unika Guid:et för varje menyalternativ i respektive MenuItems tag-property. Tag är alltså en property i ett MenuItem-objekt som lagrar en object-referens. Så du kan med fördel lagra vilken typ av data som helst där (i det här fallet ett Guid.)

Du kan sedan använda Guid för att identifiera vilket MenuItem som det klickades på.

Permalänk: https://www.webforum.nu/p/1788454

## #4 — ironhead, 2006-03-29T20:23Z

> **Phorpher skrev:**
>
> spara ett Guid tillsammans med varje menyalternativ i XML-filen. När du läser in menyalternativen och genererar MenuItems så lägger du det unika Guid:et för varje menyalternativ i respektive MenuItems tag-property. Tag är alltså en property i ett MenuItem-objekt som lagrar en object-referens. Så du kan med fördel lagra vilken typ av data som helst där (i det här fallet ett Guid.)
> 
> Du kan sedan använda Guid för att identifiera vilket MenuItem som det klickades på.

Tag-propertyn verkar vara det rätta att välja, men hur går man tillväga?

Permalänk: https://www.webforum.nu/p/1788575

## #5 — Phorpher, 2006-03-29T20:44Z

> **ironhead skrev:**
>
> Tag-propertyn verkar vara det rätta att välja, men hur går man tillväga?

Kan vi börja i en annan ände? Vad är det du försöker åstadkomma med menyn? Du vill ha en dynamisk genererad meny utifrån XML-data. Varför ska de skapas dynamiskt och vad är det för typ av events du vill koppla till varje MenuItem?

Permalänk: https://www.webforum.nu/p/1788582

## #6 — ironhead, 2006-03-29T21:56Z

> **Phorpher skrev:**
>
> Kan vi börja i en annan ände? Vad är det du försöker åstadkomma med menyn?

Jag vill skriva ut namnet i menyn och som event vill jag aktivera/visa URL:en...typ :)

snart i mål....har kommit fram till denna kod:

```
    Friend WithEvents ContextMenu1 As ContextMenu
    Friend WithEvents MenuItem1 As MenuItemAgnes

    Private Sub Form3_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
        ReadXML("webb.xml")
    End Sub

    Private Sub MenuItem1_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles MenuItem1.Click
        MessageBox.Show(MenuItem1.Tag.ToString)
    End Sub

    Private Sub ReadXML(ByVal UrlToXmlFile As String)
        Dim reader As XmlTextReader = Nothing

            reader = New XmlTextReader(UrlToXmlFile)
            ContextMenu1 = New ContextMenu

            While reader.Read
                MenuItem1 = New MenuItemAgnes
                If (reader.NodeType = XmlNodeType.Element) Then
                    If reader.Name.Equals(reader.NameTable.Add("name")) Then
                        MenuItem1.Text = reader.ReadString
                        ContextMenu1.MenuItems.Add(MenuItem1)
                    End If
                    If reader.Name.Equals(reader.NameTable.Add("URL")) Then
                        MenuItem1.Tag = reader.ReadString
                    End If
                End If
            End While
            NotifyIcon1.ContextMenu = ContextMenu1
    End Sub

Friend Class MenuItemAgnes
    Inherits MenuItem
    Private mTag As Object
    Public Property Tag() As Object
        Get
            Return mTag
        End Get
        Set(ByVal Value As Object)
            mTag = Value
        End Set
    End Property
End Class
```

Nu får jag namnen så fint i menyn i notifyicon:en, men eventet faller bort.
Flyttar jag upp "MenuItem1 = New MenuItemAgnes" ovenför loopen får jag bara sista menynamnet, men med event_click.
Hur/var ska jag lägga den?

Permalänk: https://www.webforum.nu/p/1788612

## #7 — Phorpher, 2006-03-30T07:04Z

> **ironhead skrev:**
>
> Jag vill skriva ut namnet i menyn och som event vill jag aktivera/visa URL:en...typ :)
> 
> snart i mål....har kommit fram till denna kod:
>
>
> ```
>     Friend WithEvents ContextMenu1 As ContextMenu
>     Friend WithEvents MenuItem1 As MenuItemAgnes
> 
>     Private Sub Form3_Load(ByVal sender As System.Object, _
>     ByVal e As System.EventArgs) Handles MyBase.Load
>         ReadXML("webb.xml")
>     End Sub
> 
>     Private Sub MenuItem1_Click(ByVal sender As Object, _
>     ByVal e As System.EventArgs) Handles MenuItem1.Click
>         MessageBox.Show(MenuItem1.Tag.ToString)
>     End Sub
> 
>     Private Sub ReadXML(ByVal UrlToXmlFile As String)
>         Dim reader As XmlTextReader = Nothing
> 
>             reader = New XmlTextReader(UrlToXmlFile)
>             ContextMenu1 = New ContextMenu
> 
>             While reader.Read
>                 MenuItem1 = New MenuItemAgnes
>                 If (reader.NodeType = XmlNodeType.Element) Then
>                     If reader.Name.Equals(reader.NameTable.Add("name")) Then
>                         MenuItem1.Text = reader.ReadString
>                         ContextMenu1.MenuItems.Add(MenuItem1)
>                     End If
>                     If reader.Name.Equals(reader.NameTable.Add("URL")) Then
>                         MenuItem1.Tag = reader.ReadString
>                     End If
>                 End If
>             End While
>             NotifyIcon1.ContextMenu = ContextMenu1
>     End Sub
> 
> 
> Friend Class MenuItemAgnes
>     Inherits MenuItem
>     Private mTag As Object
>     Public Property Tag() As Object
>         Get
>             Return mTag
>         End Get
>         Set(ByVal Value As Object)
>             mTag = Value
>         End Set
>     End Property
> End Class
> ```
>
> 
> Nu får jag namnen så fint i menyn i notifyicon:en, men eventet faller bort.
> Flyttar jag upp "MenuItem1 = New MenuItemAgnes" ovenför loopen får jag bara sista menynamnet, men med event_click.
> Hur/var ska jag lägga den?

Hmm. Först vill jag bara kräkas lite på VBs syntax. \*kräk\*

Nuså. Du behöver inte ärva MenuItem för att skapa en egen tag-property. Ett MenuItem har redan en tag-property.

Sen får du göra en handler som flera MenuItems använder som click-handler. Observera att mina VB.NET-kunskaper är ytterst begränsade (hur i helvete kan ni sitta och koda i den röran?!?   :bla )

```
Private Sub MenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
    ' Observera att du här måste casta sender-objektet till ett MenuItem för att sedan titta på dess tag-property. Nånting: mnuItem = CType(mnuItem, MenuItem) kanske?
    MessageBox.Show("KLICK!") 
End Sub
```

Sedan i din loop där du itererar igenom XML-noderna så registerar du varje skapad MenuItem till MenuItem_Click-handlern. Nånting sånhär kanske (?):

```
AddHandler MenuItem1.Click AddressOf MenuItem_Click
```

Sådär, nu har jag briljerat med mina VB.NET-kunskaper. Nån som inte är lika bortskämd med C# kan ju kanske utöka mina exempel och göra dem mer rätt? ;)

Permalänk: https://www.webforum.nu/p/1788648

## #8 — ironhead, 2006-03-30T18:38Z

> **Phorpher skrev:**
>
> Hmm. Först vill jag bara kräkas lite på VBs syntax. \*kräk\*
> 
> Nuså. Du behöver inte ärva MenuItem för att skapa en egen tag-property. Ett MenuItem har redan en tag-property.
> 
> Sen får du göra en handler som flera MenuItems använder som click-handler. Observera att mina VB.NET-kunskaper är ytterst begränsade (hur i helvete kan ni sitta och koda i den röran?!?   :bla )
> 
> Sedan i din loop där du itererar igenom XML-noderna så registerar du varje skapad MenuItem till MenuItem_Click-handlern. Nånting sånhär kanske (?):

\*hehe\* :) gammal slöhet att koda i VB...
Tack för all hjälp!

Permalänk: https://www.webforum.nu/p/1788942

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/144709-menuitem-addhandler
