Button eigenen Namen herausfinden.

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Button eigenen Namen herausfinden.

    Hallo :)
    Ich bin ein Neuling im Forum sowie VB.NET und habe doch auch direkt meine erste Frage :-).

    Ich habe Dynamisch Buttons und Pictureboxen mit Inhalt generiert.

    Quellcode

    1. Do While i1 < i
    2. If strfilenames(i1) = ".." Then
    3. ElseIf strfilenames(i1) = "." Then
    4. ElseIf strfilenames(i1) = Nothing Then
    5. Else
    6. imagecontrol(i1) = New PictureBox()
    7. imagecontrol(i1).Width = 150
    8. imagecontrol(i1).Height = 150
    9. imagecontrol(i1).Location = New Point(X, Y)
    10. imagecontrol(i1).ImageLocation = "http://*****.***.**/upload/" + strfilenames(i1)
    11. imagecontrol(i1).SizeMode = PictureBoxSizeMode.StretchImage
    12. Controls.Add(imagecontrol(i1))
    13. mybuttons(i1) = New Button
    14. mybuttons(i1).Text = "Löschen"
    15. mybuttons(i1).Location = New Point(X1, Y1)
    16. Dim Butonss As New Button
    17. Butonss = mybuttons(i1)
    18. AddHandler Butonss.Click, AddressOf mniLoadClick
    19. Controls.Add(mybuttons(i1))
    20. hallo = strfilenames(i1)
    21. X = X + 170
    22. X1 = X1 + 170
    23. End If


    Nun möchte ich, dass wenn der generierte Button der unter einem bestimmten Bild ist gedrückt wird, das Bild darüber gelöscht wird. Dafür müsste ich ja wissen welcher Button gedrückt wurde...
    Genau das ist mein Problem.

    Quellcode

    1. Private Sub mniLoadClick(ByVal sender As Object, ByVal e As System.EventArgs)
    2. MsgBox(hallo)
    3. End Sub


    Das steht noch am Ende meines Codes und darin müsste ich ja dann Abfragen an welcher stelle des Arrays der Button steht also z.B. : mybuttons(3)
    Dadurch könnte ich ja dann schauen was in imagecontrol(3) steht und drauf los Löschen. Nur wie finde ich das heraus oder gibt es da bessere Möglichkeiten?
    Ich lasse meinen Code auch gerne von euch Verbessern.

    P.S. Gegoogelt habe ich schon seit ein paar Tagen wie ein Verrückter, sonst wäre ich nicht so weit gekommen :)

    Ich Danke im Voraus.
    MFG der Programming Newbie
    Das geht z.B. so:

    VB.NET-Quellcode

    1. Private Sub mniLoadClick(ByVal sender As Object, ByVal e As System.EventArgs)
    2. Dim btn As Button = DirectCast(sender, Button)
    3. MessageBox.Show(btn.Name)
    4. End Sub
    Du kannst auch die Property Tag verwenden, um mehrere Button zu unterscheiden.
    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!
    Danke für die schnelle Antwort...
    Nun zeigt er mir eine MsgBox in der nicht drin steht...
    Hier mal der ganze Code:

    Quellcode

    1. Imports System.Net
    2. Public Class Form1
    3. Dim i As Integer = "0"
    4. Dim i1 As Integer = "1"
    5. Dim i2 As Integer = "0"
    6. Dim X As Integer = "10"
    7. Dim Y As Integer = "150"
    8. Dim X1 As Integer = "42"
    9. Dim Y1 As Integer = "310"
    10. Dim strfilenames(50000) As String
    11. Dim mybuttons(50000)
    12. Dim File As String
    13. Dim WithEvents web As New Net.WebClient
    14. Dim imagecontrol(500000)
    15. Dim pfadlocal As String = "bilder/"
    16. Dim pfadinet As String
    17. Dim sport As String
    18. Dim Link As String = "******"
    19. Dim test As String
    20. Private hallo As String
    21. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    22. Dim request As Net.FtpWebRequest = Net.FtpWebRequest.Create("*********")
    23. request.Method = Net.WebRequestMethods.Ftp.ListDirectory
    24. request.Credentials = New Net.NetworkCredential("******", "*****")
    25. Dim response As Net.FtpWebResponse = request.GetResponse()
    26. Using myReader As New IO.StreamReader(response.GetResponseStream())
    27. Do While myReader.EndOfStream = False
    28. i = i + 1
    29. strfilenames(i) = myReader.ReadLine
    30. Loop
    31. End Using
    32. i = i + 1
    33. Do While i1 < i
    34. If strfilenames(i1) = ".." Then
    35. ElseIf strfilenames(i1) = "." Then
    36. ElseIf strfilenames(i1) = Nothing Then
    37. Else
    38. sport = pfadlocal + strfilenames(i1)
    39. pfadinet = Link + strfilenames(i1)
    40. Dim web As New Net.WebClient
    41. web.Credentials = New Net.NetworkCredential("*****", "******")
    42. 'web.DownloadFile(pfadinet, sport)
    43. End If
    44. i1 = i1 + 1
    45. Loop
    46. i1 = 1
    47. Do While i1 < 5
    48. If strfilenames(i1) = ".." Then
    49. ElseIf strfilenames(i1) = "." Then
    50. ElseIf strfilenames(i1) = Nothing Then
    51. Else
    52. imagecontrol(i1) = New PictureBox()
    53. imagecontrol(i1).Width = 150
    54. imagecontrol(i1).Height = 150
    55. imagecontrol(i1).Location = New Point(X, Y)
    56. imagecontrol(i1).ImageLocation = "*****" + strfilenames(i1)
    57. imagecontrol(i1).SizeMode = PictureBoxSizeMode.StretchImage
    58. Controls.Add(imagecontrol(i1))
    59. mybuttons(i1) = New Button
    60. mybuttons(i1).Text = "Löschen"
    61. mybuttons(i1).Location = New Point(X1, Y1)
    62. Dim Butonss As New Button
    63. Butonss = mybuttons(i1)
    64. AddHandler Butonss.Click, AddressOf mniLoadClick
    65. Controls.Add(mybuttons(i1))
    66. hallo = strfilenames(i1)
    67. X = X + 170
    68. X1 = X1 + 170
    69. End If
    70. If i2 = 7 Then
    71. Y = Y + 190
    72. i2 = 1
    73. X = 10
    74. Y1 = Y1 + 190
    75. X1 = 42
    76. End If
    77. i1 = i1 + 1
    78. i2 = i2 + 1
    79. Loop
    80. End Sub
    81. Private Sub mniLoadClick(ByVal sender As Object, ByVal e As System.EventArgs)
    82. Dim btn As Button = DirectCast(sender, Button)
    83. MessageBox.Show(btn.Name)
    84. End Sub
    85. End Class
    Ich sehe in deinem Code nicht, wo du dem erstellten Button einen Namen gibst.
    Allerdings solltest du vllt. eh besser anstatt .Name den .Tag benutzen.

    Beim Erstellen einfügen

    mybuttons(i1).Tag = i1


    und bei dem Click Event

    MessageBox.Show(btn.Tag.ToString)

    //Edit
    Ach so, vielleicht sollte ich noch zeigen, wie du dadurch nen Vorteil hast. Im Click Event kannst du dann den Button Anhand des Index im .Tag identifizieren.

    Select Case btn.Tag
    Case 1
    'Button 1 geklickt
    Case 2
    'Button 2 ..
    Case else
    'Irgendein anderer
    End Select
    Edit: Mist, ich war zu langsam. Ich poste jedoch zur Vollständigkeit das was ich eigentlich schreiben wollte:

    @Unwesen: Sollte btn.Tag nicht zuerst in Integer umgewandelt werden?
    Wenn der TE das Bild (selber Index) einfach nur disposen möchte kann man es auch gleich so machen:

    VB.NET-Quellcode

    1. imagecontrol(CInt(DirectCast(sender, Button).Tag)).Dispose
    2. 'oder
    3. imagecontrol(CInt(DirectCast(sender, Button).Tag)).Image = Nothing 'Wenn die PictureBox noch bleiben soll.


    Allerdings bleibt der Button dann noch da und wenn man nochmal klickt wird mit "an Sicherheit grenzender Wahrscheinlichkeit" (hab's nicht getestet) eine NullReverenceException geworfen, weil imagcontrol(selberIndex) ja anschließend auf Nothing verweißt. Es kann also nicht schaden DirectCast(sender, Button).Dispose auch noch zu verwenden, wenn der Button auch weg sein soll.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner: Nein.
    Tag muss zuerst in einen String und danach in eine Zahl konvertiert werden, sonst knallt es.
    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!
    @RodFromGermany: Ehrlich? Bei mir nicht. Mache ich was falsch?
    Ich verwende

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. If CInt(DirectCast(sender, Button).Tag) = 1 Then
    3. MessageBox.Show("Funzt")
    4. End If
    5. End Sub

    Beim Click auf den Button kommt die MessageBox.

    Den Tag habe ich einmal im MyBase.Load Event mit Button1.Tag = 1 zugewiesen und ein anderes Mal im Eigenschaftenfenster. Beides funktioniert.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Niko Ortner: Ist korrekt so.
    Hab eben noch mal meine Quellen durchgesehen, object kann direkt in Integer konvertiert werden.
    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!