webForumDet fria alternativet

MenuItem + addHandler

7 svar · 596 visningar · startad av ironhead

ironheadMedlem sedan mars 20011 346 inlägg
#1

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?

ironheadMedlem sedan mars 20011 346 inlägg
#2

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
PhorpherMedlem sedan feb. 20002 300 inlägg
#3

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å.

ironheadMedlem sedan mars 20011 346 inlägg
#4

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?

PhorpherMedlem sedan feb. 20002 300 inlägg
#5

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?

ironheadMedlem sedan mars 20011 346 inlägg
#6

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?

PhorpherMedlem sedan feb. 20002 300 inlägg
#7

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? ;)

ironheadMedlem sedan mars 20011 346 inlägg
#8

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!

132 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)