den richtigen Button finden

  • VB.NET

Es gibt 63 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    den richtigen Button finden

    Hallo zusammen,
    ich erzeuge während der Laufzeit verschiedene Buttons denen ich ein ContextMenuStrip zuweise. Wenn ich nun auf einen dieser Buttons mit der rechten Maustaste klicke verzweigt das Programm in eine bestimmte Sub. Wie kann ich innerhalb dieser Sub abfragen welcher der Buttons geklickt wurde?

    Im Voraus danke für Eure Bemühungen
    Hey,

    ganz einfach.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. For i As Integer = 0 To 10
    4. Dim b As New Button
    5. b.Text = i.ToString()
    6. AddHandler b.Click, AddressOf b_Click
    7. Me.FlowLayoutPanel1.Controls.Add(b)
    8. Next
    9. End Sub
    10. Private Sub b_Click(ByVal sender As Object, ByVal e As EventArgs)
    11. Dim b As Button = DirectCast(sender, Button)
    12. MessageBox.Show("Button Text=" & b.Text)
    13. End Sub
    14. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    web933 schrieb:

    Wie kann ich innerhalb dieser Sub abfragen welcher der Buttons geklickt wurde?
    Z.B. so:

    VB.NET-Quellcode

    1. Private Sub Button1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown, Button2.MouseDown, Button3.MouseDown
    2. BlaToolStripMenuItem.Tag = sender
    3. End Sub
    4. Private Sub BlaToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles BlaToolStripMenuItem.Click
    5. Dim btn As Button = DirectCast(BlaToolStripMenuItem.Tag, Button)
    6. MessageBox.Show(btn.Text)
    7. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Verzeiht einem nicht mehr ganz taufrischen älteren Herrn eventuell dumme Fragen.
    So erstelle ich die Buttons:

    VB.NET-Quellcode

    1. Dim myButton As New Button
    2. With myButton
    3. 'BesetztMelder(CInt(Liste(4)), CInt(Liste(5))) = Eingelesen
    4. BesetztMelder(EbeneTemp, MelderTemp) = Eingelesen
    5. .Text = ""
    6. .Name = Liste(3)
    7. .Width = SymbX
    8. .Height = SymbY
    9. .Left = Liste(1) - SymbX / 2
    10. .Top = Liste(2) - SymbY / 2
    11. .AutoSize = False
    12. .BackgroundImage = My.Resources.bes0
    13. .BackgroundImageLayout = ImageLayout.Zoom
    14. .ContextMenuStrip = conBut : .Cursor = Cursors.Hand
    15. AddHandler .Click, AddressOf myButton_Click
    16. ' Hier wird der Button erzeugt ------------------------------------------------------------------
    17. Me.Controls.Add(myButton)
    18. myButton.BringToFront()
    19. End With


    Bei: "AddHandler .Click, AddressOf myButton_Click" reklamiert er mir das "myButton_Click" und sagt, dass es nicht deklariert wurde. Was mache ich falsch?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „web933“ ()

    WithEvents

    VB.NET-Quellcode

    1. Private WithEvents myButton As Button ' dies muss außerhalb der Prozedur, in der Klasse stehen.
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. myButton = New Button
    4. ' hier Dein weiterer Code
    5. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Darf ich dieses Thema noch einmal aufwärmen? Ich bin jetzt so weit:
    Wenn ich so:

    VB.NET-Quellcode

    1. With myButton
    2. BesetztMelder(EbeneTemp, MelderTemp) = Eingelesen
    3. .Text = ""
    4. .Name = Liste(3)
    5. .Width = SymbX
    6. .Height = SymbY
    7. .Left = Liste(1) - SymbX / 2
    8. .Top = Liste(2) - SymbY / 2
    9. .AutoSize = False
    10. .BackgroundImage = My.Resources.bes0
    11. .BackgroundImageLayout = ImageLayout.Zoom
    12. .ContextMenuStrip = conBut : .Cursor = Cursors.Hand
    13. AddHandler myButton.Click, AddressOf conButVerschieben_Click
    14. ' Hier wird der Button erzeugt ------------------------------------------------------------------
    15. Me.Controls.Add(myButton)
    16. myButton.BringToFront()
    17. End With

    Den Button während der Laufzeit erstelle und dann bei einem Linksklick hier lande:

    VB.NET-Quellcode

    1. Private Sub conButVerschieben_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles conButVerschieben.Click
    2. Dim myButton As Button = DirectCast(sender, Button)
    3. MessageBox.Show("Button Text= " & myButton.Name)
    4. End Sub

    wird mir der Name des Buttons angezeigt. ABER!!!

    Seltsamerweise lande ich bei einem Rechtsklick in der gleichen Sub und erhalte dann die Fehlermeldung:

    Das Objekt des Typs "System.Windows.Forms.ToolStripMenuItem" kann nicht in Typ "System.Windows.Forms.Button" umgewandelt werden.

    Was mache ich noch falsch?
    Bei mir steht "Left" "Rigth" bzw. "Middle" in der MessageBox.

    Du kann dir aber auch Integer werte anzeigen lassen und diese für eine if abfrage nutzen.

    VB.NET-Quellcode

    1. Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    2. Dim wert As Integer = e.Button
    3. MessageBox.Show(CStr(wert))
    4. End Sub
    Weil Du das richtige Event behandeln musst. Ein bisschen selber nachdenken würde an manchen Stellen einen unglaublichen Lerneffekt haben

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. Dim b As New Button
    4. b.Text = "test"
    5. Me.Controls.Add(b)
    6. AddHandler b.MouseDown, AddressOf b_MouseDown
    7. End Sub
    8. Private Sub b_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
    9. Me.Text = e.Button.ToString()
    10. End Sub
    11. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Du bist zwar im richtigen Event, abefr der Cast vom Sender auf das Conrol geht schief.
    Wenn Du mehreren verschiedenen Controls diesen Handler zuweist, musst Du vor dem Casten prüfen, welchen Typs der Sender ist:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. If TypeOf (sender) Is Button Then
    3. MessageBox.Show("Button")
    4. End If
    5. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nur @ SpaceyX Müssen denn immer diese schulmeisterlichen, erhobenen Zeigefinger sein? Ich weiß nicht, wie alt Du bist und wie lange Du schon mit VB arbeitset. Ich bin 61 und versuche mich in das Ganze einzuarbeiten. Du kannst mir glauben, ich denke nach. Manchmal vielleicht in die falsche Richtung. Schön, wenn Dir das in Deiner Anfangszeit erspart blieb.

    MFG
    Entschuldige bitte. War nicht böse gemeint. Aber in der Regel trifft man eher auf lernunwillige Halberwachsene. Bitte sei nicht böse und denke nicht, ich habe keinen Respekt vor "älteren" Menschen. Natürlich ist es nicht meine Aufgabe, Dich zu belehren.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Wenn Du verzweigen willst, kannst Du es so machen...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. Dim b As New Button
    4. b.Text = "test"
    5. Me.Controls.Add(b)
    6. AddHandler b.MouseDown, AddressOf b_MouseDown
    7. End Sub
    8. Private Sub b_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
    9. If TypeOf (sender) Is Button Then
    10. Select Case e.Button
    11. Case Windows.Forms.MouseButtons.Right
    12. RightClick()
    13. Case Windows.Forms.MouseButtons.Left
    14. LeftClick()
    15. Case Windows.Forms.MouseButtons.Middle
    16. MiddleClick()
    17. End Select
    18. End If
    19. End Sub
    20. Private Sub MiddleClick()
    21. MessageBox.Show("Mittelklick-Zweig")
    22. End Sub
    23. Private Sub LeftClick()
    24. MessageBox.Show("Linksklick-Zweig")
    25. End Sub
    26. Private Sub RightClick()
    27. MessageBox.Show("Rechtsklick-Zweig")
    28. End Sub
    29. End Class


    Wichtig ist nur, dass Du das Mouse-Down-Event behandelst, nicht das Click-Event, da Du hier keine Information darüber erhälst, welcher Knopf gedrückt wurde. Das MouseDown-Event hat eine andere Signatur. So sollte Dein Vorhaben eigentlich umzusetzen sein.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o