PDA

Vollständige Version anzeigen : Vom ContexMenu den Text abrufen


xennex
28.01.2007, 12:59
Bei MVS 2005 kann man den Text mit hilfe des ContextMenuStrip-Event den Text abrufen die man während der Laufzeit hinzugefügt hat hier ist der Code den mir jemand geschickt hat:
Public Class Form1
Private WithEvents CmStrip As New ContextMenuStrip
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i As Integer = 1 To 5
CmStrip.Items.Add("Auswahl " & i.ToString)
Next i
Me.ContextMenuStrip = CmStrip
End Sub

Private Sub CmStrip_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles CmStrip.ItemClicked
MessageBox.Show(e.ClickedItem.Text)
End Sub
End Class


Das Problem ist nur ich besitze die 2003er Version.
Kann man den Text irgendwie auch mit der 2003 version abrufen.

hcscherzer
29.01.2007, 12:39
ContextMenu1.MenuItems(0).Text
oder wenn Du die einzelnen Menü-Einträge über die Mouse-Down Ereignisse verwaltest, z.B.:MenuItem32.Text

xennex
29.01.2007, 13:43
Danke für deine antwort, aber bei der 2003er Version gibt es keinen MouseDown - Event für das menuitem oder die ContextMenuStrip klasse die gibt es erst ab der 2005 version.

Für das KontexMenu gitb es nur die beiden Events:
Popup,Dispose

Für das MenuItem:
Click, DrawItem, MeasureItem, Popup und Select
Mehr ist leider nicht möglich.
kannst du mir bitte nen code schreiben mit dem Click-Event?

hcscherzer
30.01.2007, 14:02
Simmt, ich benutze das MouseDown für die Kontext-Menus, die ich selbst erzeuge.
Aber hier kommt ein Beispiel für das, was Dir hoffentlich hilft: Private Sub MenuClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click, MenuItem2.Click, MenuItem3.Click
if sender Is MenuItem1 then messagebox.show(MenuItem1.Text)
end sub

xennex
30.01.2007, 21:18
Habe jetzt ein kleines Beispiel geschrieben wie ich es jetzt schreiben würde.
Private WithEvents CMenu As New MenuItem

Private Sub CMenu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CMenu.Click
'CPicEdit ist das KontexMenü
MessageBox.Show(CPicEdit.MenuItems(0).MenuItems(?).Text)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim ClickEvent As New EventHandler(AddressOf CMenu_Click)
CMenu.Text="Effekte"
For i As Integer = 1 To 5
CMenu.MenuItems.Add("Effekt " & i.ToString, ClickEvent)
Next i
CPicEdit.MenuItems.Add(CMenu)
End Sub

Das funktion ganz Gut, beim rotem Fragezeichen brauche ich nur noch den index eintragen, bloß wie rufe ich den index ab der gerade angeklickt wurde?
Bei mir gibt es auch kein SelectIndex oder dergleichen.

hcscherzer
01.02.2007, 13:53
Moin,
ich mache das bei dynamisch erzeugten Steuerelementen so, dass ich sie bei der Erzeugung in einem globalen Array speichere und dann im Click-Event abfrage, welches Element denn der Sender gewesen ist. Also z.B.Public h_bx() As Button
Public p As Panel ' wird irgendwo einem real existierenden Panel zugewiesen

Public Sub buttons_konstruieren(n As Integer)
Dim b As Button, i As Integer
ReDim h_bx(n+1)
For i = 0 To n
b = New Button
b.Text = "Button " & i.ToString
' usw. für b.Top bis b.BackColor ...
p.Controls.Add(b)
h_bx(i) = b
AddHandler b.Click, AddressOf b_click
Next i
End Sub

Public Sub b_click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim i As Integer
For i = 0 To h_bx.Lenght - 1
If sender is h_bx(i) Then
' hier kommt die Verarbeitung
End If
Next i
End Sub
Müsste eigentlich mit MenuItems statt Buttons und KontextMenu statt Panel auch funktionieren. Ich habe ähnliches auch schon mit den Objekten Label, Textbox, CheckBox und RadioButton getrieben. Probiers doch einfach mal aus.

xennex
01.02.2007, 21:10
Danke Funktioniert Perfekt, habe von woanders auch nen Code bekommen:
Private Sub CMenu_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CMenu.Click
Dim SenderMenuItem As MenuItem = DirectCast(sender, MenuItem)
MessageBox.Show(CPicEdit.MenuItems(0).MenuItems(SenderMenuItem.Index).Text)
End Sub