ironheadMedlem sedan mars 20011 346 inlägg 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 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
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
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
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
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
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
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!