Labels und Buttons in ein Panel erstellen und entfernen

  • VB.NET

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

    @VBHunter Objektorientierte Programmierung.
    Ein Usercontrol ist ein Objekt, das daten für genau einen Kunden hält.
    Indem Du auf eines klickst, ist der Kunde dahinter aktiviert.
    Wenn was für alle Kunden passieren soll, sende ein Event vom Hauptprogramm an alle Controls.
    Wenn ein Kunde seine Daten ändern will, sendet er ein Event an das Hauptfenster.
    Im Parameter Sender ist das Control dieses Kunden codiert.
    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!
    Achso Okay....@RodFromGermany

    hast du ein simples Beispiel? ich bin immer ehr der Praxis typ um dinge zu verstehen. :/

    wenn ich es richtig verstehe:
    Also wenn ich jetzt auf dem Button vom Kunden 3 Klicke so weiß das UC das der Preis 15,60 € ist ?

    Dann übergebe ich diesen klick wieder auf die Form und überprüfe den Preis der Variable per IF?

    Sorry, versuche nur zu verstehen. DANKE :D

    EDIT:
    @ErfinderDesRades ne ne ... ist der Debug modus und hab nur das Wichtige ausgeschnitten ^^
    es ist ein FlowLayoutPanel mit UserControl oder ehr umgekehrt ...

    VBHunter schrieb:

    Also wenn ich jetzt auf dem Button vom Kunden 3 Klicke so weiß das UC das der Preis 15,60 € ist ?
    Sofern da ein Control da ist, in dem dieser Wert steht und Du per Klick organisierst, dass das erste Control, dass Du aktivierst, diesen Wert zugeordnet bekommt.
    Ich denke mal, dass Du zunächst beschreiben solltest, was da überhaupt abläuft, dass wir uns hier nicht iwelches Zeugs ausdenken und Du mit jedem zweiten Deiner Posts eine neue Aufgabenstellung unterjubelst.
    Also:
    Poste eine belastbare Aufgabenstellung.
    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 Sorry... das Stimmt, der hintergrund fehlt.

    Also es ist ein Alpha Spiel ... man hat sein Einzelhandelsladen und hat Kunden die in den Laden kommen. Jede Stunde kommt ein Kunde im Bild beispiel alle 10 Sek. und der Kunde wird in einen FlowLayoutPanel erstellt per UserControl...



    hierzu der Code (Der Counter)

    VB.NET-Quellcode

    1. Dim ots As TimeSpan = New TimeSpan(0, 0, _Counter)
    2. _Counter -= 1
    3. If _Counter <= -1 Then
    4. _Counter = 10 '3600
    5. Guthaben -= 1000.0
    6. lbl_Guthaben.Text = Guthaben.ToString("C")
    7. If Level = 1 Then
    8. Kundenerstellen()
    9. ElseIf Level >= 2 And Level <= 5 Then
    10. Kundenerstellen()
    11. Kundenerstellen()
    12. End If
    13. lbl_Stichtag.Text = $"{ots.ToString()}"
    14. End If


    hier mein Kundenerstellen()

    VB.NET-Quellcode

    1. Public Sub Kundenerstellen()
    2. Dim uc As UserControl1 = New UserControl1()
    3. Dim Zufallszahlen = Me.Random.Next(1, 20)
    4. Dim Preis As Double = CDbl(uc.Label5.Text)
    5. Dim Blumen As Double = 1.2
    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.ToString("## x")
    9. uc.Label4.Text = "Blumen"
    10. Preis = CDbl(Zufallszahlen * Blumen)
    11. uc.ButtonText = "kassieren"
    12. FlowLayoutPanel1.Controls.Add(uc)
    13. uc.Label5.Text = Preis.ToString("C")
    14. End Sub


    Hier das Usercontrol:

    VB.NET-Quellcode

    1. Private Sub UserControl1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. End Sub
    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. Button1.AutoSize = True
    21. End Set
    22. End Property
    23. Public Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    24. MessageBox.Show("Der Kunde wird abkassiert", "Kassensystem", MessageBoxButtons.OK, MessageBoxIcon.Information)
    25. Me.Parent.Controls.Remove(Me)
    26. End Sub


    und jetzt :

    Jetzt will ich halt das wenn ich auf ein Button vom Kunden klicke die ja per Timer automatisch erstellt werden, soll er Prüfen ob man genug Geld oder Blumen im Lager hat.

    hoffe jetzt kannst du oder einer mir weiterhelfen :/
    @RodFromGermany

    hab mal gebastelt und es versucht ... so ungefähr als Event zu machen wie du es sagtest....

    es klappt jetzt sogar... als Test hab ich eingestellt, wenn man auf den Button klickt soll der Preis der X Blumen abggezogen werden ... Geht !

    Neuer Fehler :S .... leider macht er jetzt die Kunden nicht mehr schön untereinander, sondern wenn der Countdown abgelaufen ist und der nächste Kunde erscheinen soll verschwindet der Oberste und wird durch den Neuen ersetzt. Es ist also immer nur ein Kunde da nur die Angaben ändern sich... ?(

    was ist der Fehler?

    hier mein UserControl (AKTUELL)

    VB.NET-Quellcode

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


    hier mein Formcode (AKTUELL)

    VB.NET-Quellcode

    1. ' Hier die Variabeln
    2. Private Zufallsnamen() As String = {"Dr. Locke", "Herr Suse", "Frau Meisner", "Herr Wiedemann", "Frau Münsch", "Dr. Wiese", "Frau Köhler", "Herr Sause", "Frau Mertens"}
    3. Dim uc As UserControl1 = New UserControl1()
    4. Dim Konto As Double = 1000.0
    5. Public Guthaben As Double
    6. Dim Level As Integer = 1
    7. Dim Blumensumme As Integer = 10
    8. Dim Preis As Double
    9. Dim Blumen As Double = 1.2
    10. 'Der Tick für den Countdown
    11. Private Sub Stichtag_Tick(sender As Object, e As EventArgs) Handles Stichtag.Tick 'Stichtag
    12. Dim ots As TimeSpan = New TimeSpan(0, 0, _Counter)
    13. _Counter -= 1
    14. If _Counter <= -1 Then
    15. _Counter = 5 '3600
    16. Guthaben -= 1000.0
    17. lbl_Guthaben.Text = Guthaben.ToString("C")
    18. If Level = 1 Then
    19. Kundenerstellen()
    20. ElseIf Level >= 2 And Level <= 5 Then
    21. Kundenerstellen()
    22. Kundenerstellen()
    23. End If
    24. lbl_Stichtag.Text = $"{ots.ToString()}"
    25. End Sub
    26. 'Der Shown damit er weiter im hintergrund ausführt
    27. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    28. AddHandler uc.Buttonklick, AddressOf Abkassieren
    29. End Sub
    30. 'Hier wird der Kunde erstellt (siehe im Timer Tick)
    31. Public Sub Kundenerstellen()
    32. Dim Zufallszahlen = Me.Random.Next(1, 20)
    33. uc.Label1.Text = (New Random().Next(1, 5)).ToString("Kasse ###,#0")
    34. uc.Label2.Text = Zufallsnamen(CInt(Fix(6 * Rnd())))
    35. uc.Label3.Text = Zufallszahlen.ToString("## x")
    36. uc.Label4.Text = "Blumen"
    37. Preis = CDbl(Zufallszahlen * Blumen)
    38. uc.ButtonText = "kassieren"
    39. FlowLayoutPanel1.Controls.Add(uc)
    40. uc.Label5.Text = Preis.ToString("C")
    41. End Sub
    42. 'Hier das Event was er nach dem Klick auf den Button ausführen soll
    43. Public Sub Abkassieren()
    44. Guthaben -= Preis
    45. lbl_Guthaben.Text = Guthaben.ToString("C")
    46. uc.Parent.Controls.Remove(uc)
    47. End Sub


    Hoffe ihr könnt mir bei mein RIESEN problem helfen ;(

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

    VB.NET-Quellcode

    1. Public Sub Kundenerstellen()
    2. 'hier fehlt was
    3. Dim Zufallszahlen = Me.Random.Next(1, 20)
    4. uc.Label1.Text = (New Random().Next(1, 5)).ToString("Kasse ###,#0")
    5. uc.Label2.Text = Zufallsnamen(CInt(Fix(6 * Rnd())))
    6. uc.Label3.Text = Zufallszahlen.ToString("## x")
    7. uc.Label4.Text = "Blumen"
    8. Preis = CDbl(Zufallszahlen * Blumen)
    9. uc.ButtonText = "kassieren"
    10. FlowLayoutPanel1.Controls.Add(uc)
    11. uc.Label5.Text = Preis.ToString("C")
    12. End Sub

    Du verweist immer auf uc. Also das einzige UserCotrol, was jemals erstellt wurde. Und zwar in Zeile#3, Post#26 (»mein Formcode (AKTUELL)«). Wenn Du dessen Eigenschaften veränderst - naja, was erwartest Du denn? Du erstellst ja nie weitere/zusätzliche UserControls per New. Jene Stelle habe ich mit »hier fehlt was« markiert. Da kannst Du reinhauen: Dim uc As New UserControl1.
    Und wie RfG schon schrieb: 1x New Random reicht. Zeile#4 des zitierten Codes von mir widerspricht dem.

    btw: Entferne mal den VB6-Namespace (Stichwort: Fix, Rnd) und gib den CEs sinnvolle Namen; inkl dem UserControl
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hey super Danke @VaporiZed das ist schon mal ein schritt nach von.

    hab das mal eingefügt und getestet mit

    Dim us As New UserControl1 kein erfolg ||

    New Random hab ich ergenzt durch uc.Label1.Text = Me.Random.Next(1, 5).ToString("Kasse ###,#0")

    Hier weiß ich nicht genau wie ich es ändern kann das FIX und Rnd weg ist uc.Label2.Text = Zufallsnamen(CInt(Fix(6 * Rnd()))) habs bis jetzt nur so uc.Label2.Text = Zufallsnamen(CInt(6 * Rnd()))

    Frage:

    Das ich in der Form oben als Variable

    VB.NET-Quellcode

    1. Dim uc As UserControl1 = New UserControl1()


    drin hab ist okay?

    Momentan ist es bei mir so das er jetzt die Kunden wieder untereinander macht aber nicht Rechnet... :S

    hab im Shown

    VB.NET-Quellcode

    1. AddHandler uc.Buttonklick, AddressOf Abkassieren


    das ist mein Abkassieren()

    VB.NET-Quellcode

    1. Public Sub Abkassieren()
    2. Guthaben -= Preis
    3. lbl_Guthaben.Text = Guthaben.ToString("C")
    4. End Sub


    Hoffentlich kannst du weiterhelfen?

    VBHunter schrieb:

    hab das mal eingefügt und getestet mit
    Dim us As New UserControl1 kein erfolg
    Mit dieser Aussage kann ich nix anfangen. Was soll das heißen: kein Erfolg?
    Da in der Sub Kundenerstellen() nun ein neues UC angelegt wird, muss dieses auch eventtechnisch angestöpselt werden. Will heißen, dass z.B. in die letzte Zeile der Prozedur noch kommt:
    AddHandler uc.Buttonklick, AddressOf Abkassieren
    So wird das neu angelegte UC mit der Sub Abkassieren verknüpft. Achtung! Abkassieren muss dann aber noch wissen, wer die Sub aufgerufen hat! D.h., dass die Sub ggf. eine andere Signatur bekommen muss und die Parameter ausgewertet werden müssen:

    VB.NET-Quellcode

    1. Public Sub Abkassieren(sender as Object, e As EventArgs)
    2. Guthaben -= Preis
    3. lbl_Guthaben.Text = Guthaben.ToString("C")
    4. End Sub

    Dann bekommst Du mit DirectCast(sender, UserControl1) heraus, welches UC die Sub aufgerufen hat. Allerdings sieht der Code in der Abkassieren-Sub momentan so aus, als ob es niemanden interessiert, welches UC die Sub aufgerufen hat, weil nur allgemein ein Guthaben verändert wird, aber nicht geschaut wird, durch wen. Gibt es da etwa ein Gemeinschaftsgeldkonto für alle Kunden? Ich will da auch einkaufen!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ah okay wieder Danke @VaporiZed,

    Danke für die Bildliche Beschreibung also war mein AddHandler uc.Buttonklick, AddressOf Abkassieren schon mal falsch :D

    jetzt ist es in der Kundenerstellen() am Ende. Richtig?

    Das mit:

    VaporiZed schrieb:

    Dann bekommst Du mit DirectCast(sender, UserControl1) heraus, welches UC die Sub aufgerufen hat.


    habe ich nicht ganz verstanden und noch nie gehört ?(

    Also DirectCast(sender, UserControl1) in die Sub vom Abkassieren ?

    VaporiZed schrieb:

    Allerdings sieht der Code in der Abkassieren-Sub momentan so aus, als ob es niemanden interessiert, welches UC die Sub aufgerufen hat, weil nur allgemein ein Guthaben verändert wird, aber nicht geschaut wird, durch wen. Gibt es da etwa ein Gemeinschaftsgeldkonto für alle Kunden? Ich will da auch einkaufen!


    Na ja ich will es so aufbauen das Guthaben das ist was man hat z.b. 1000 € und wenn man auf ein Kunden klickt der 15,60 € kostet dann 1000-15,60 rechnet und mir dann oben die Summe richtig anzeigt. Momentan macht er das auch aber er rechnet immer nur den letzten kunden den er neu hinzugefügt hat.

    Erklärung:
    Ich klicke auf den Button vom 2 Kunden mit 15,60 € und er zieht den letzten Kunden ab den er erstellt hat z.b. 12,00 €.

    Danke schonmal für weitere Hilfe

    VBHunter schrieb:

    Das [...]habe ich nicht ganz verstanden und noch nie gehört
    vielleicht, aber bestimmt schon zig mal gesehen, z.B.:
    Private Sub Stichtag_Tick(sender As Object, e As EventArgs) Handles Stichtag.Tick
    Kurze Erklärung: Angenommen, es wurden zwischenzeitlich 10 UserControls erstellt. Und alle verbinden ihren Button-Click mit der Abkassieren-Sub. Jetzt ruft ein UC also irgendwann die Abkassieren-Sub auf. Und mittels dem sender-Objekt, welches jeder Sub übergeben wird, kann das Programm nun erkennen, wer da überhaupt jene Sub aufgerufen hat. Da sich das allerdings mit nem allgemeinen Object meist etwas schwierig zu handhaben gestaltet, verwendet man diese DirectCast-Zeile, um auf das konkrete UC-Objekt zugreifen zu können, welche die Sub aufrief.
    Stell Dir vor, dass Leute ihre Briefe bei einer Poststelle abgeben. Wenn es in der Poststelle nun Rückfragen zu einem Brief gibt (Empfänger verzogen, nicht lesbar, falsch frankiert), muss die Poststelle wissen, welchem Absender sie bescheid geben muss. Und der Absender steht normalerweise auf dem Brief mit drauf. Und so ist es mit dem sender-Objekt eben auch. in jenem Objekt steht der Absender, also in diesem Fall das auslösende UC drin.

    VBHunter schrieb:

    Na ja ich will es so aufbauen das Guthaben das ist was man hat z.b. 1000 € und wenn man auf ein Kunden klickt der 15,60 € kostet

    Wer hat denn das Guthaben? Und wieso kostet ein Kunde etwas? Ist das n Blumenladen oder ein verdrehter Puff? Sorry für die blöde Nachfrage, aber ich blick's grad nicht sonderlich. In meiner Welt hat der Kunde ein Guthaben (= Geld im Portemonnaie) und die Blumen kosten was.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Wer hat denn das Guthaben? Und wieso kostet ein Kunde etwas? Ist das n Blumenladen oder ein verdrehter Puff?
    Gute Fragen, und wir dürfen der Antwort mit Spannung entgegensehen.

    Weil wennich mir dashier angugge:

    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)
    Dann habe ich den Eindruck, dass hier ein Kassensystem entstehen soll ohne jedes geplante Datenmodell.
    Das wird noch mühsam werden...
    Und wieder Danke @VaporiZed für die super erklärung, das hab ich in der Tat schon einige male verwendet ^^

    Die Verwendung dieser DirectCast-Zeile wende ich also immer in einer Sub an wo ich herrausfinden will was angeklickt wurde.

    VaporiZed schrieb:

    Wer hat denn das Guthaben? Und wieso kostet ein Kunde etwas? Ist das n Blumenladen oder ein verdrehter Puff? Sorry für die blöde Nachfrage, aber ich blick's grad nicht sonderlich. In meiner Welt hat der Kunde ein Guthaben (= Geld im Portemonnaie) und die Blumen kosten was.


    HEHE also ich dachte ihr habt meine Poasts gelesen da habe ich schon oft geschrieben was ich gerade mache.
    Es soll sowas wie ein Kaufmannsladen sein, wie du schon sagst ... Ich habe ein Guthaben z.b. 1000 ,- € und Baue mein Geschäft aus, alle 60 Minuten kommen Kunden in mein Geschäft (jetzt werden die Kunden erstellt per Timer) jeder Kunde kauft etwas anderes oder steht an einer anderen Kasse (Zufallsprinzip) man bekommt dann Beispiel 15,60 € dafür hat man 13 Blumen weniger im Geschäft ... momentan hab ich nur Blumen hinzugefügt als Test ... 1 Blume Kostet 1.20 € das mal die Anzahl die er per zufall erstellt.

    VB.NET-Quellcode

    1. Dim Zufallszahlen = Me.Random.Next(1, 20)
    2. uc.Label3.Text = Zufallszahlen.ToString("## x")


    das ist Kundenerstellen()

    VB.NET-Quellcode

    1. Dim uc As UserControl1
    2. Dim Zufallszahlen = Me.Random.Next(1, 20)
    3. uc.Label1.Text = Me.Random.Next(1, 5).ToString("Kasse ###,#0")
    4. uc.Label2.Text = Zufallsnamen(CInt(6 * Rnd()))
    5. uc.Label3.Text = Zufallszahlen.ToString("## x")
    6. uc.Label4.Text = "Blumen"
    7. Preis = CDbl(Zufallszahlen * Blumen)
    8. uc.Button1.Text = "kassieren"
    9. FlowLayoutPanel1.Controls.Add(uc)
    10. uc.Label5.Text = Preis.ToString("C")
    11. AddHandler uc.Buttonklick, AddressOf Abkassieren


    Jetzt habe ich erstmal als Test damit ich kontrolieren kann ob er auch XY ausführt bei Klick, einfach das Guthaben minus Gesamtpreis(Preis) genommen

    VB.NET-Quellcode

    1. Guthaben -= Preis
    2. lbl_Guthaben.Text = Guthaben.ToString("C")

    also ist nur eine Testprogrammierung. Ich will sowas in zukunft mal verwenden und mache mich auf "Praktischen" wege daran. ^^ nur komme ich nicht weiter und hänge in einer Sackgasse :/

    So das mal zur erklärung

    VBHunter schrieb:

    Ich habe ein Guthaben z.b. 1000 ,- € [...] jeder Kunde kauft etwas [...] man bekommt dann Beispiel 15,60 € dafür
    => Guthaben sinkt nicht, sondern steigt, weil Du ja Blumen VERkaufst, also Geld bekommst. Anderenfalls zurück zu Post#30:

    VaporiZed schrieb:

    Gibt es da etwa ein Gemeinschaftsgeldkonto für alle Kunden? Ich will da auch einkaufen!
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Richtig !!!! Aber es ist ein Test ... ob ich + oder - Rechne ist in diesen Fall egal ich will nur Testen das er etwas ausführt wenn ich auf den Button von den Kunden klicke.


    EDIT:

    aber irgendwie bekomm ich das mit dem directcast nicht hin ich habe jetzt versucht

    VB.NET-Quellcode

    1. Dim btn As UserControl1 = DirectCast(sender, UserControl1)


    und in der Sub

    VB.NET-Quellcode

    1. Public Sub Abkassieren(ByRef Sender As Object)


    jetzt sagt er mir aber im

    AddHandler uc.Buttonklick, AddressOf Abkassieren

    das Abkassieren nicht kompatibel ist. ?(

    hier nochmal das ganze bild:

    VB.NET-Quellcode

    1. Public Sub Kundenerstellen()
    2. Dim uc As UserControl1 = New UserControl1()
    3. Dim Zufallszahlen = Me.Random.Next(1, 20)
    4. uc.Label1.Text = Me.Random.Next(1, 5).ToString("Kasse ###,#0")
    5. uc.Label2.Text = Zufallsnamen(CInt(6 * Rnd()))
    6. uc.Label3.Text = Zufallszahlen.ToString("## x")
    7. uc.Label4.Text = "Blumen"
    8. Preis = CDbl(Zufallszahlen * Blumen)
    9. uc.Button1.Text = "kassieren"
    10. FlowLayoutPanel1.Controls.Add(uc)
    11. uc.Label5.Text = Preis.ToString("C")
    12. AddHandler uc.Buttonklick, AddressOf Abkassieren
    13. End Sub
    14. Public Sub Abkassieren(Sender As Object)
    15. Dim btn As UserControl1 = DirectCast(Sender, UserControl1)
    16. Guthaben += Preis
    17. lbl_Guthaben.Text = Guthaben.ToString("C")
    18. End Sub


    Sorry das ich das noch nicht so ganz schnalle :/

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

    Beachte bitte Post#30: Public Sub Abkassieren(sender as Object, e As EventArgs); Du hast den 2. Parameter vergessen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VBHunter schrieb:

    VB.NET-Quellcode

    1. uc.Label2.Text = Zufallsnamen(CInt(6 * Rnd()))
    What :?:
    Du hast doch inzwischen einen stationären VB.NET-Zufallsgenerator.
    Du solltest mal überlegen, welche Methoden und Properties dem Hauptprogramm und welche dem UserControl zugewiesen werden.
    Gib dem UserControl ein Event:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Event MyClick(sender As Object, e As EventArgs)
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. RaiseEvent MyClick(Me, e)
    4. End Sub
    das Du dann im Hauptprogramm abonierst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub Kundenerstellen()
    2. ' ...
    3. AddHandler uc.MyClick, AddressOf Abkassieren
    4. End Sub
    5. Public Sub Abkassieren(Sender As Object, e As EventArgs)
    6. ' ...
    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!
    Danke @RodFromGermany ... Ich hatte in der Zeit weiter getestet und rumprobiert ... mir hatte nur noch diese Zeile gefehlt:

    Public Event MyClick(sender As Object, e As EventArgs)

    manchmal sind es die Kleinen dinge die wichtig sind. :D

    Ich hab so verbaut und geht auch ganz gut, bis auf wenn ich auf ein 2 Kunden klicke der 15,60 € ist nimmt er den letzten Kunden der erstellt wurde z.b. 24,00 €

    echt nicht einfach :whistling:

    Soll der DirectCast(Sender, UserControl1) trotzdem rein im Abkassieren?

    VB.NET-Quellcode

    1. Public Sub Abkassieren(sender As Object, e As EventArgs)
    2. Dim uc1 As UserControl1 = DirectCast(sender, UserControl1)
    3. Guthaben += Preis
    4. lbl_Guthaben.Text = Guthaben.ToString("C")
    5. End Sub
    @VBHunter Wenn Du auf Properties des UserControls zugreifen muss, brauchst Du den Cast.
    Ansonsten mach Dir Deine eigenen EventArgs und pack da alle Properties rein, die Du brauchst:

    VB.NET-Quellcode

    1. Class MyEventArge
    2. Inherits EventArgs
    3. Public Property Name As String
    4. Public Sub New(nn As String)
    5. Me.Name = nn
    6. End Sub
    7. End Class
    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 Okay...

    Oh je das ist wieder was neues :S .... Muss ich dafür eine Neue Klasse einfügen oder setze ich sowas einfach an die Form nach einer Sub? Sorry für die vielleicht blöde Frage hatte jetzt nichts wirklich gefunden wie man mit EventArgs umgeht ... Hat mein Buch nicht X/

    hab in mein UserControl das:

    VB.NET-Quellcode

    1. Public Property ButtonText As String
    2. Get
    3. Return Button1.Text
    4. End Get
    5. Set(value As String)
    6. Button1.Text = value
    7. Button1.AutoSize = True
    8. End Set
    9. End Property