Labels und Buttons in ein Panel erstellen und entfernen

  • VB.NET

Es gibt 74 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Labels und Buttons in ein Panel erstellen und entfernen

    Hallo,

    ich würde gerne in mein Panel ein Label erstellen wo z.b. "Testtext" steht, daneben soll auch ein Button erscheinen.

    Klickt man jetzt auf den Button so soll eine aktion ausgeführt werden und das Label und Button aus der Zeile soll verschwinden...

    Ich habe es jetzt soweit das Label und Button erstellt werden, so sieht es aus



    das ist der Code: (Label und Button wird erstellt)

    VB.NET-Quellcode

    1. Private Sub Kassensystem()
    2. Dim a As New Label
    3. Dim b As New Button
    4. Dim Y As Integer = Label24.Location.Y
    5. Dim X As Integer = Label24.Location.X
    6. Dim V As Integer = Button27.Location.Y
    7. Dim W As Integer = Button27.Location.X
    8. For Each T As Control In Me.Panel4.Controls
    9. If TypeOf T Is Label AndAlso T.Location.Y > Y Then Y = T.Location.Y
    10. If TypeOf T Is Button AndAlso T.Location.Y > Y Then Y = T.Location.Y
    11. Next
    12. a.Parent = Me
    13. a.Location = New Point(Label24.Location.X, Y + 40)
    14. b.Parent = Me
    15. b.Location = New Point(Button27.Location.X, Y + 40)
    16. Me.Panel4.Controls.Add(a)
    17. Me.Panel4.Controls.Add(b)
    18. With a
    19. .Name = "Labellabel"
    20. .Text = "Ich bin ein Testtext"
    21. .AutoSize = True
    22. End With
    23. With b
    24. .Name = "Buttonlabel"
    25. .Text = "Kunden Kassieren"
    26. .AutoSize = True
    27. End With
    28. End Sub


    das ist der Code wenn man auf den Button 27 Klickt bzw. was er machen soll aber nicht macht da es dann denke ich mal kein Button27 mehr ist oder?

    VB.NET-Quellcode

    1. Private Sub Kassieren()
    2. Dim a As New Label
    3. Dim b As New Button
    4. Dim Y As Integer = Label24.Location.Y
    5. Dim X As Integer = Label24.Location.X
    6. Dim V As Integer = Button27.Location.Y
    7. Dim W As Integer = Button27.Location.X
    8. Me.Panel4.Controls.Remove(a)
    9. Me.Panel4.Controls.Remove(b)
    10. Me.Panel4.Controls.RemoveByKey("Labellabel")
    11. Me.Panel4.Controls.RemoveByKey("Buttonlabel")
    12. End Sub


    Meine Frage, wie bekomm ich das hin das er die Zeile löscht, beispiel auf den Bild klickt man auf den zweiten Button, nun soll das Label und Button in zeile zwei verschwinden?

    danke für eure Hilfe!!!!
    @VBHunter Mach Dir ein UserControl mit Label und Button und pack beliebig viele davon in ein FlowLayoutPanel:
    docs.microsoft.com/de-de/dotne…N&view=netframework-4.7.2
    docs.microsoft.com/de-de/dotne…s-using-a-flowlayoutpanel
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Danke @RodFromGermany für deine antwort.

    Wie mach ich mir ein UserControl, ist das ein Steuerelement?

    Ich hätte vieleicht noch erwähnen sollen das ich per Timer die Labels und Buttons hinzufügen will ...Beispiel

    der Timer zählt runter und alle 10 Sek. kommt ein neues Label "Kunde1" und ein Button "Kunden abkassieren", wichtig aber in einer Zeile.
    Jetzt sind beispielsweise schon 60 sek. vergangen und 6 Kunden stehen schon da, je mit Label und Button, jetzt klicke ich auf den Button von Kunde3 und kassier ihn ab.
    Nur diese Zeile soll verschwinden (Label und Button) alle anderen bleiben erhalten.

    Wie finde ich herraus was das für ein Button ist auf den man klickt? Bitte wenn möglich ein beispiel.
    @RodFromGermany

    Ich glaub jetzt hab ich ein lösungsansatz gefunden. Ist wirklich besser in ein FlowLayoutPanel. :D

    jedenfals läuft es wie es soll, Plausiebel?

    Als test mit einen Button statt mit einen Timer: Klicke ich auf den Button passiert das:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'hinzufügen
    2. Kassensystem()
    3. End Sub


    hier die Aktion:

    VB.NET-Quellcode

    1. Private Sub Kassensystem()
    2. Dim a As New Label
    3. Dim b As New Button
    4. Dim Y As Integer = Label25.Location.Y
    5. Dim X As Integer = Label25.Location.X
    6. Dim V As Integer = Button28.Location.Y
    7. Dim W As Integer = Button28.Location.X
    8. For Each T As Control In Me.FlowLayoutPanel1.Controls
    9. If TypeOf T Is Label AndAlso T.Location.Y > Y Then Y = T.Location.Y
    10. If TypeOf T Is Button AndAlso T.Location.Y > Y Then Y = T.Location.Y
    11. Next
    12. a.Parent = Me
    13. a.Location = New Point(Label25.Location.X, Y + 40)
    14. b.Parent = Me
    15. b.Location = New Point(Button28.Location.X, Y + 40)
    16. Me.FlowLayoutPanel1.Controls.Add(a)
    17. Me.FlowLayoutPanel1.Controls.Add(b)
    18. With a
    19. .Anchor = AnchorStyles.None
    20. .Name = "Labellabel"
    21. .Text = "Ich bin ein Testtext"
    22. .AutoSize = True
    23. End With
    24. With b
    25. .Name = "Buttonlabel"
    26. .Text = "Kunden Kassieren"
    27. .AutoSize = True
    28. End With
    29. AddHandler b.Click, AddressOf btn_Click
    30. End Sub


    das Event:

    VB.NET-Quellcode

    1. Private Sub btn_Click()
    2. MsgBox("Der Kunde wird jetzt abkassiert", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "Kasse 1")
    3. Kassieren()
    4. End Sub


    VB.NET-Quellcode

    1. Private Sub Kassieren()
    2. Dim a As New Label
    3. Dim b As New Button
    4. Dim Y As Integer = Label25.Location.Y
    5. Dim X As Integer = Label25.Location.X
    6. Dim V As Integer = Button28.Location.Y
    7. Dim W As Integer = Button28.Location.X
    8. Me.FlowLayoutPanel1.Controls.Remove(a)
    9. Me.FlowLayoutPanel1.Controls.Remove(b)
    10. Me.FlowLayoutPanel1.Controls.RemoveByKey("Labellabel")
    11. Me.FlowLayoutPanel1.Controls.RemoveByKey("Buttonlabel")
    12. End Sub


    wäre super fals ihr noch verbesserungen habt ...

    bis dahin DANKE

    VBHunter schrieb:

    Ist wirklich besser in ein FlowLayoutPanel.
    Hast Du es damit getestet?
    Ja, ein UserControl ist ein eigenes Steuerelement.
    Projekt - Hinzufügen - Benutzersteuerelement (oder so ähnlich).
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Wie RodFromGermany schon geschrieben hat, ein Benutzersteuerelement hinzufügen.
    Dem Benutzersteuerelement ein Label und einen Button hinzufügen.
    Code im Benutzersteuerelement

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class UserControl1
    3. <Browsable(True), _
    4. DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), _
    5. Description("Der dem Label zugeordnete Text")> _
    6. Public Overrides Property Text As String
    7. Get
    8. Return Label1.Text
    9. End Get
    10. Set(value As String)
    11. Label1.Text = value
    12. End Set
    13. End Property
    14. Public Property ButtonText As String
    15. Get
    16. Return Button1.Text
    17. End Get
    18. Set(value As String)
    19. Button1.Text = value
    20. End Set
    21. End Property
    22. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    23. MessageBox.Show("Der Kunde wird jetzt abkassiert", "Kasse 1", MessageBoxButtons.OK, MessageBoxIcon.Information)
    24. Me.Parent.Controls.Remove(Me)
    25. End Sub
    26. End Class

    Code zum hinzufügen über Knopf

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim uc As UserControl1 = New UserControl1()
    3. uc.Text = (New Random().NextDouble * 100).ToString("C")
    4. uc.ButtonText = "Kunden Kassieren"
    5. FlowLayoutPanel1.Controls.Add(uc)
    6. End Sub
    Hast Du es damit getestet?


    Ja hab ich ... läuft

    Ja, ein UserControl ist ein eigenes Steuerelement.
    Projekt - Hinzufügen - Benutzersteuerelement (oder so ähnlich)


    Stimmt, hatte nur falsch geschaut. Danke !

    @HenryV WOW das ist ja mega gut genau so wie ich es wollte, super danke !

    Frage: gibt es auch zufallsnamen die man per New ausführen kann z.b. das Meier rauskommt oder so?

    VBHunter schrieb:

    zufallsnamen
    Du kannst in Deinen Ressourcen eine Liste mit Namen hinzufügen und dann per Zufallsindex einen rausholen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    jetzt hab ich es so gemacht:

    VB.NET-Quellcode

    1. Private Zufallsnamen() As String = {"Tom", "Fred", "Ted", "Daniel", "Alex", "Rob"}


    VB.NET-Quellcode

    1. Dim uc As UserControl1 = New UserControl1()
    2. uc.Label1.Text = "Kasse " & (New Random().Next(1, 5)).ToString()
    3. uc.Label2.Text = Zufallsnamen(CInt(Fix(6 * Rnd())))
    4. uc.Label3.Text = (New Random().Next(1, 20)).ToString()
    5. uc.Label4.Text = "Blumen"
    6. uc.Label5.Text = (New Random().NextDouble * 100).ToString("C")
    7. uc.ButtonText = "Kunden Kassieren"
    8. FlowLayoutPanel1.Controls.Add(uc)


    geht auch gut :)

    Frage wie könnte ich das jetzt machen wenn er Prüfen soll ob z.b. die Summe im Label 3 (Anzahl der Blumen) vorhanden sind ...

    Beispiel:
    Ich klicke jetzt drauf und es wird das erstellt:
    Kasse 1 Tom 15 Blumen 69,20 € "KUNDEN KASSIEREN"

    ich möchte das er z.b. eine Msg ausgibt "zu wenig Blumen vorhanden" wenn ich nur 10 hab ....

    Blumen ist so deklariert

    "Dim Blumen As Integer"

    VBHunter schrieb:

    "zu wenig Blumen vorhanden"

    VB.NET-Quellcode

    1. If Blumen < 15 Then
    2. MessageBox("zu wenig Blumen vorhanden")
    3. End If
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hehe Danke @RodFromGermany das kenn ich ja :D

    ich meine wie find ich herraus was er für eine Zufallszahl erstellt hat bei Label3

    VB.NET-Quellcode

    1. uc.Label3.Text = (New Random().Next(1, 20)).ToString()
    2. uc.Label4.Text = "Blumen"


    aber ich habe dies auch als Variable erstellt und einfach den Preis für Blumen Deklariert z.b.

    VB.NET-Quellcode

    1. Dim Blumen As Integer = "1.20" 'für 1.20 €
    2. Dim Zufallszahlen As String = New Random().Next(1, 20).ToString("###,#00")
    3. 'dann bei
    4. uc.Label5.Text = (New Random().NextDouble * 100).ToString("C")
    5. 'einfach in
    6. uc.Label5.Text = Zufallszahlen * Blumen


    edit:

    igendwie bekomm ich es grad nicht hin das er mir bei Label5 die Summe in Euro anzeigt

    VB.NET-Quellcode

    1. Dim uc As UserControl1 = New UserControl1()
    2. Dim Zufallszahlen As String = New Random().Next(1, 20).ToString("###,#00")
    3. Dim Blumen As Integer = "120"
    4. Dim Rosen As Integer = "1.10"
    5. uc.Label1.Text = (New Random().Next(1, 5)).ToString("Kasse ###,#0")
    6. uc.Label2.Text = Zufallsnamen(CInt(Fix(6 * Rnd())))
    7. uc.Label3.Text = Zufallszahlen
    8. uc.Label4.Text = "Blumen" ' Or "Käse" Or "Wurst"
    9. uc.Label5.Text = Zufallszahlen * Blumen.ToString() '(New Random().NextDouble * 100).ToString("C")
    10. uc.ButtonText = "Kunden Kassieren"
    11. FlowLayoutPanel1.Controls.Add(uc)


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VBHunter“ ()

    VBHunter schrieb:

    wie find ich herraus
    Leg Dir eine Hilfs-Variable mit der Zufallszahl an.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    wie meinst du das ungefähr ?

    ist das oder

    VB.NET-Quellcode

    1. Dim Zufallszahlen As String = New Random().Next(1, 20)




    Ich hab das jetzt mit der Summe so geklärt:

    VB.NET-Quellcode

    1. Dim uc As UserControl1 = New UserControl1()
    2. Dim Zufallszahlen As String = New Random().Next(1, 20) '.ToString() '"###,#00")
    3. Dim Preis As String = uc.Label5.Text
    4. Dim Blumen As Integer = "1.20"
    5. Dim Rosen As Integer = "1.10"
    6. uc.Label1.Text = (New Random().Next(1, 5)).ToString("Kasse ###,#0")
    7. uc.Label2.Text = Zufallsnamen(CInt(Fix(6 * Rnd())))
    8. uc.Label3.Text = Zufallszahlen
    9. uc.Label4.Text = "Blumen" ' Or "Käse" Or "Wurst"
    10. Preis = Zufallszahlen * Blumen '(New Random().NextDouble * 100).ToString("C")
    11. uc.ButtonText = "Kunden Kassieren"
    12. FlowLayoutPanel1.Controls.Add(uc)
    13. uc.Label5.Text = Format(Val(Preis), "###,#0.00 €").ToString


    aber er zeigt mir z.b. bei 1x Blumen = 120,00 € wie bekommt man es hin das er 1,20 € zeigt

    VB.NET-Quellcode

    1. Dim Blumen As Integer = "1.20"


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

    VBHunter schrieb:

    ist das oder
    OMG.
    Mach zunächst Option Strict On.
    New Random() wird in Deinem Programm genau ein Mal aufgerufen.

    VB.NET-Quellcode

    1. Private Rnd As Random = New Random()
    2. '---
    3. Dim MyRandom = Me.Rnd.Next(1, 20)

    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ja :/ habs Aktiviert

    Fehler, Fehler, Fehler .... warte, noch ein Fehler....

    ...

    So alle fehler gelöst!

    wie kann ich das lösen?

    aber er zeigt mir z.b. bei 1x Blumen = 120,00 € wie bekommt man es hin das er 1,20 € zeigt


    Dim Blumen As Integer = "1.20"



    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VBHunter“ ()

    Also wie ich herausgefunden hab zeigt er es nur nicht in der nachkommastelle an und rundet auf .... was kann ich dagegen tun ?

    habs jetzt so ... in Double

    VB.NET-Quellcode

    1. Dim uc As UserControl1 = New UserControl1()
    2. Dim Zufallszahlen = Me.Random.Next(1, 20)
    3. Dim Preis As Integer = CInt(uc.Label5.Text)
    4. Dim Blumen As Double = 1.2
    5. uc.Label1.Text = (New Random().Next(1, 5)).ToString("Kasse ###,#0")
    6. uc.Label2.Text = Zufallsnamen(CInt(Fix(6 * Rnd())))
    7. uc.Label3.Text = CType(Zufallszahlen, String)
    8. uc.Label4.Text = "Blumen"
    9. Preis = CInt(Zufallszahlen * Blumen)
    10. uc.ButtonText = "Kunden Kassieren"
    11. FlowLayoutPanel1.Controls.Add(uc)
    12. uc.Label5.Text = Format(Val(Preis), "C").ToString


    beim ergebnis kommt dann z.b. 18 x 1,2 = 21,60 €... er zeigt aber 22,00 €
    @VBHunter So:

    VB.NET-Quellcode

    1. uc.Label5.Text = Preis.ToString("C")
    Formatieren, nicht runden :!:
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    hm :/ mag er trotzdem nicht ???

    Rundet trotzdem.

    EDIT:

    .... blöd .... sorry ...

    Preis natürlich in "Double" und die CInt() in CDbl()

    ta ta !!! :D

    Danke für den Klatscha

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VBHunter“ ()

    HenryV schrieb:

    Wie RodFromGermany schon geschrieben hat, ein Benutzersteuerelement hinzufügen.
    Dem Benutzersteuerelement ein Label und einen Button hinzufügen.
    Code im Benutzersteuerelement

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class UserControl1
    3. <Browsable(True), _
    4. DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), _
    5. Description("Der dem Label zugeordnete Text")> _
    6. Public Overrides Property Text As String
    7. Get
    8. Return Label1.Text
    9. End Get
    10. Set(value As String)
    11. Label1.Text = value
    12. End Set
    13. End Property
    14. Public Property ButtonText As String
    15. Get
    16. Return Button1.Text
    17. End Get
    18. Set(value As String)
    19. Button1.Text = value
    20. End Set
    21. End Property
    22. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    23. MessageBox.Show("Der Kunde wird jetzt abkassiert", "Kasse 1", MessageBoxButtons.OK, MessageBoxIcon.Information)
    24. Me.Parent.Controls.Remove(Me)
    25. End Sub
    26. End Class

    Code zum hinzufügen über Knopf

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim uc As UserControl1 = New UserControl1()
    3. uc.Text = (New Random().NextDouble * 100).ToString("C")
    4. uc.ButtonText = "Kunden Kassieren"
    5. FlowLayoutPanel1.Controls.Add(uc)
    6. End Sub


    Ich habe ja dieses UserControl jetzt verbaut und klappt auch super, wie kann ich jetzt von meiner Form auf das UC zugreifen und sagen wenn ich Kunde 3 angeklickt habe auf dem Button Kassieren das er dann z.b. den Preis vom Konto abzieht?

    also hier mal ein Bild wie es aufgebaut ist:




    Klicke ich jetzt auf dem 3 Kunden soll z.b. 15.60 ,- € vom Konto abgezogen werden

    VB.NET-Quellcode

    1. Dim Konto As Double = 1000.0
    2. 'wohin mit meiner IF frage? Shown?
    3. If Preis < Konto Then 'Button1.Click ist doch auch nicht Richtig oder? Wie bekomme ich raus welcher Button geklickt wurde?
    4. MessageBox.Show("Du hast zu wenig Geld auf dein Konto.", "Kassensystem", MessageBoxButtons.OK, MessageBoxIcon.Information)
    5. End If


    INFO:

    Quellcode

    1. Preis = CDbl(Zufallszahlen * Blumen)
    ..... Heißt, dass die Zufallszahl * 1.20 genommen wird = Preis

    Frage(n):

    Wie bekomme ich herraus welcher Button geklickt wurde?

    Wo muss die If frage hin was er tun soll wenn der Button geklickt wird?


    Danke im vorraus für eure Hilfe.