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 schrieb:

    Muss ich dafür eine Neue Klasse einfügen
    Das ist eine neue Klasse.
    Ob Du sie als neue Klasse Deinem Projekt hinzufügst oder so in eine Klasse einfügst, ist formal egal, der gute Stil sagt, dass Du eine neue Klasse erstellst.
    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 danke für die erklärung ^^

    Wie könnte ich jetzt von Abkassieren() auf die Property Name zugreifen wenn ich UC nicht dreklariert hab in der Form sondern nur in der Sub Kundenerstellen()?

    Kundenerstellen() Sub:

    VB.NET-Quellcode

    1. Dim uc As New 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.ButtonText = "kassieren"
    9. uc.Label5.Text = Preis.ToString("C")
    10. AddHandler uc.MyClick, AddressOf Abkassieren
    11. FlowLayoutPanel1.Controls.Add(uc)


    Abkassieren sub:

    VB.NET-Quellcode

    1. Public Sub Abkassieren(sender As Object, e As EventArgs)
    2. uc.Name = "Otto"
    3. Guthaben += Preis
    4. lbl_Guthaben.Text = Guthaben.ToString("C")
    5. End Sub


    Wenn ich Dim uc As New UserControl1() am anfang der Form Deklarieren würde erstellt er die Kunden wieder nur in einer Zeile und Reiht sie nicht untereinander :huh:

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

    VBHunter schrieb:

    Wie könnte ich jetzt von Abkassieren() auf die Property Name zugreifen
    Wo hast Du Dein Kurzzeitgedächtnis gelassen? Schreibe als erste Zeile in der Abkassieren-Sub: Dim uc = DirectCast(sender, UserControl1)
    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.
    Also: Wenn Du das über Dein MyClick-Event machen willst, dann folgendes:
    RfG hat sich minimal verschrieben. Es soll bestimmt nicht MyEventArge, sondern MyEventArgs heißen, aber wurscht. Kann auch TheBigBangTheory heißen, aber man sollte bei Namensvergabe bei den Tatsachen bleiben.
    Wenn Du MyEventArgs hernehmen willst, musst Du auch bei MyClick diese MyEventArgs übergeben, sonst bringt es Dir nix. Außerdem musst Du Deine Abkassieren-Sub so ändern, dass sie nicht e As EventArgs kennt, sondern e As MyEventArgs. Sonst werden all die spezifischen Propertys von MyEventArgs einfach aussortiert, wenn Abkassieren aufgerufen werden.
    Summa summarum:

    VB.NET-Quellcode

    1. Class MyEventArgs
    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

    Im UserControl-Code:

    VB.NET-Quellcode

    1. Public Event MyClick(sender As Object, e As MyEventArgs)
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. RaiseEvent MyClick(Me, New MyEventArgs("der Name des Kunden")) '*
    4. End Sub

    *oder Me.Label1.Text, obwohl der Kundenname in einer Variablen, und nicht (nur) nicht in einem CE stehen sollte

    im Form-Code:

    VB.NET-Quellcode

    1. Public Sub Abkassieren(sender As Object, e As MyEventArgs)
    2. Dim Kundenname = e.Name 'wofür Du es auch immer brauchst
    3. Guthaben += Preis
    4. lbl_Guthaben.Text = Guthaben.ToString("C")
    5. End Sub

    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.
    Okay danke für die Erklärung, witzig ist ich schaue nebenbei gerade TheBigBangTheory dachte spionierst mich :D

    Das mit "Name" war von RfG ja denke ich mal nur ein Beispiel, ich selber brauche den Namen des Kunden nicht mir ist wichtig das er die Menge, Artikelart und gesamtsumme übernimmt und dan in meiner Form von der Variablen abzieht oder addiert, nur er übernimmt immer nur den jetzten Kunden und Schreibt die Summe gut.



    Das was du geschrieben hast habe ich so übernommen ohne veränderung, es ist wie vorher. :/ langsam nervts
    Klar macht er das. Wir können Dir nur Hilfestellungen geben. Der Preis muss natürlich auch vom UC mitgeliefert werden. Du hingegen veränderst das Geschäftsguthaben immer noch durch die Form-Variable Preis - obwohl es die gar nicht geben sollte. Das UC liefert den Preis. Also muss der auch vom UC mittels MyEventsArgs an die Abkassieren-Sub geliefert werden.
    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 gut ich glaub ich verstehe also muss ich es z.b. so machen

    VB.NET-Quellcode

    1. Public Sub Abkassieren(sender As Object, e As MyEventArgs)
    2. Dim customPrice = e.money
    3. Guthaben += customPrice
    4. lbl_Guthaben.Text = Guthaben.ToString("C")
    5. End Sub


    er Verlangt hier bei der Name des Kunden eine eingabe (hab es in Double geändert) will ich die () weg machen = Fehler

    VB.NET-Quellcode

    1. RaiseEvent MyClick(Me, New MyEventArgs("der Name des Kunden"))

    in

    VB.NET-Quellcode

    1. RaiseEvent MyClick(Me, New MyEventArgs(0.0))


    Ich möchte ja das er es übernimmt und nicht das ich es vorgebe welchen Preis der Button hat, oder lieg ich da jetzt falsch?
    What? Ich versteh leider weniger als die Hälfte von dem, was Du geschrieben hast.
    Arbeite bitte an Deiner Ausdrucksweise.

    VBHunter schrieb:

    Ich möchte ja das er es übernimmt
    Wer soll was übernehmen?

    VBHunter schrieb:

    welchen Preis der Button hat
    Ein Button hat keinen Preis. Ok, doch: Stromkosten, weil man zur Benutzung den Computer anmachen muss.
    Irgendein Label bei jedem UC zeigt den Preis an. Den kannst Du an MyEventArgs und somit dann an das MyClick-Event und damit an die Abkassieren-Sub übergeben. Würde der Preis, den der jeweilige Kunde zu zahlen hat, in einer echten Variable stehen, wäre es noch etwas klarsichtiger.
    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.
    Ja in dingen erklären bin ich nicht gut .... Sorry dafür ... ich denke das ich auch teils vielleicht missverstanden werde.

    EDIT:
    Aber es geht alles nicht so wie ich es mir dachte, wenn ich die Artikel Automatisieren will so das sie per zufall gewählt werden.

    VB.NET-Quellcode

    1. Dim ZufallsArtikel() As String = {"Blumen", "Rosen"}
    2. Dim Zufall As Integer
    3. Zufall = CInt(Math.Round(Rnd() * UBound(ZufallsArtikel)))
    4. uc.Label4.Text = ZufallsArtikel(Zufall)


    Wie kann ich da bestimmen das er Label 4 z.b. Rosen nennt und dann bei label5 die Zufallszahl mal den Artikel nimmt der per Zufall raus kam?

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

    OK, vielleicht gestalten wir das etwas anders. Statt zu umschreiben, was Du haben willst, solltest Du 1-3 Beispiele bringen, wie Dein Wunschergebnis aussehen soll und wie es momentan aussieht. Es geht los mit Dim ZufallsArtikel() As String = {"Blumen", "Rosen"}. Da Rosen auch gleichzeitig Blumen sind, ist die "Auswahl" nicht nur mager, sondern auch verwirrend. Ist ein besseres Beispiel vielleicht: Dim ZufallsArtikel() As String = {"Rosen", "Tulpen", "Nelken", "Narzissen"}?

    VBHunter schrieb:

    Wie kann ich da bestimmen das er Label 4 z.b. Rosen nennt
    Das dürfte ja schon der Fall sein, will heißen: Dieses Ergebnis dürfte ja schon erscheinen.

    VBHunter schrieb:

    und dann bei label5 die Zufallszahl mal den Artikel nimmt der per Zufall raus kam?
    Was für ne Zufallszahl? Meinst Du damit den zufälligen Index, der die Schnittblumensorte angibt, also 0 = Blumen und 1 = Rosen? Was willst Du im Label5-Text stehen haben? 0xBlumen und/oder 1xRosen?
    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 Da geb ich dir Recht das Blumen sehr allgemein ist, aber das war leider nur wieder ein Test :D aber wir nehmen jetzt mal dein Beispiel "Rosen", "Tulpen", "Nelken", "Narzissen"

    VB.NET-Quellcode

    1. '###Test
    2. Dim Nelken As Double = 0.99
    3. Dim Rosen As Double = 3.0
    4. Dim Tulpen As Double = 1.2
    5. Dim Narzissen As Double = 1.99


    VaporiZed schrieb:

    Was für ne Zufallszahl? Meinst Du damit den zufälligen Index, der die Schnittblumensorte angibt, also 0 = Blumen und 1 = Rosen? Was willst Du im Label5-Text stehen haben? 0xBlumen und/oder 1xRosen?


    Ja genau irgendwie so, ich will das bei Label4 Eine Zufällige sorte / Artikel angezeigt wird

    VB.NET-Quellcode

    1. uc.Label4.Text = ZufallsArtikel(Zufall)


    Das macht er ja auch prima!

    nur bei Label5 soll er ja die Zufallsanzahl von Label3 mal den Artikel von Label4 Rechnen um bei Label5 den Gesamtpreis für z.B. 15x Rosen zu sehen.

    VB.NET-Quellcode

    1. Dim Zufallszahlen = Me.Random.Next(1, 20)
    2. Preis = Zufallszahlen * ZufallsArtikel


    Wie du schon sagst, ich will den Index wissen was der jetzt für ein Zufallsartikel gewählt hat.

    VB.NET-Quellcode

    1. Zufallszahl * Zufallsartikel() 'der Index der Automatisch generiert wurde


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

    VaporiZed schrieb:

    Statt zu umschreiben, was Du haben willst, solltest Du 1-3 Beispiele bringen, wie Dein Wunschergebnis aussehen soll und wie es momentan aussieht.
    Deine Beispiele?

    VBHunter schrieb:

    nur bei Label5 soll er ja die Zufallsanzahl von Label3 mal den Artikel von Label4 Rechnen um bei Label5 den Gesamtpreis für z.B. 15x Rosen zu sehen.

    VBHunter schrieb:

    Preis = Zufallszahlen * ZufallsArtikel
    Sorry, aber das ist doch wieder inhaltlicher Mumpitz. Man kann nicht rechnen: 3 x Rosen. Das wäre wie: Wieviel ergibt 5 + Kartoffel - 3 Universen². Was Du wohl willst, ist eine kombinierte Anzeige, bestehend aus Anzahl, Sorte und Gesamtpreis (der sich aus Einzelpreis und Artikelanzahl berechnet).

    VBHunter schrieb:

    Wie du schon sagst, ich will den Index wissen was der jetzt für ein Zufallsartikel gewählt hat.
    Glaub ich kaum. Das wäre nämlich Zufall aus Zeile#4 in Post#51.

    Das klappt alles deshalb nicht, weil Du - wie @ErfinderDesRades vor viiieeelen Posts bereits sagte - kein vernünftiges Datenmodell hast. Wenn Du nun Preis hardcoded verwendest, Stichwort:

    VB.NET-Quellcode

    1. Dim Nelken As Double = 0.99
    2. Dim Rosen As Double = 3.0
    3. Dim Tulpen As Double = 1.2
    4. Dim Narzissen As Double = 1.99
    (was inhaltlich auch wieder unsinnig ist. Was soll denn das bedeuten: Dim Nelken As Double = 0.99? Der Variablenname lügt. Korrekt wäre z.B. Dim PreisProNelkeInEuro As Double = 0.99
    Dann müsstest Du wieder ein großes IF-Konstrukt machen im Sinne von If Zufallsartikel = "Rose" Then Gesamtpreis = Stückzahl * Rosen usw.; das wäre aber ziemlicher Hunz.

    Leg Dir erstmal bitte eine Blumen- oder besser eine Artikelklasse an. Die erhält erstmal die Propertys Name und Preis pro Stück. Anderenfalls werden wir hier nie fertig. Später können wir alle noch über tDS und Co. reden. Viel später.
    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:

    Deine Beispiele?


    Sorry hatte den Poast darüber Bearbeitet und hinzugefügt wie ich es mir vorstelle.

    VaporiZed schrieb:

    Was Du wohl willst, ist eine kombinierte Anzeige, bestehend aus Anzahl, Sorte und Gesamtpreis (der sich aus Einzelpreis und Artikelanzahl berechnet).


    Ja Richtig, so das er mir zeigt 3x Rosen und gesamtpreis dann das auch berechnet ... So das er Zufall anzahl x Zufall Artikel nimmt

    Dim PreisProNelkeInEuro As Double = 0.99

    Ja gut wenn man es wieder genau nimmt dann müsse man die Einzelpreise nehmen und es natürlich auch so benennen.

    Ja das mit der If frage dachte ich mir ja auch aber denke mir mal bei 1000 Artikeln wäre das ein mega IF.

    Ich habe jetzt eine Class.vb die Produkte.vb heißt

    VB.NET-Quellcode

    1. '###Test
    2. Dim PreisProNelkeInEuro As Double = 0.99
    3. Dim PreisProRoseInEuro As Double = 3.0
    4. Dim PreisProTulpeInEuro As Double = 1.2
    5. Dim PreisProNarzisseInEuro As Double = 1.99
    6. '###Obst
    7. Dim PreisProBananeInEuro As Double = 0.29
    8. Dim PreisProApfelInEuro As Double = 0.49
    9. Dim PreisProBirneInEuro As Double = 0.49
    10. Dim PreisProPflaumeInEuro As Double = 0.39
    11. Dim PreisProNektarineInEuro As Double = 0.99
    12. Dim PreisProWeintraubenInEuro As Double = 1.49
    13. Dim PreisProBlaubeerenInEuro As Double = 1.99
    14. Dim PreisProHimbeerenInEuro As Double = 1.99
    15. '###Brote
    16. Dim PreisProToastbrotInEuro As Double = 1.29
    17. Dim PreisProSandwichtoastInEuro As Double = 1.99
    18. Dim PreisProGraubrotInEuro As Double = 0.99
    19. Dim PreisProPumpernickelInEuro As Double = 1.49
    20. Dim PreisProVollkornbrotInEuro As Double = 0.99
    21. Dim PreisProKürbiskernbrotInEuro As Double = 0.99
    22. Dim PreisProSonnenblumenkernbrotInEuro As Double = 0.99
    Dafuq? Falscher Weg. Es werden weder Preise noch Namen, also allgemein: keine konkreten Daten in den Code eingearbeitet.

    VB.NET-Quellcode

    1. Public Class Artikel
    2. Private Name As String = Nothing
    3. Private PreisProEinheitInCent As Integer = 0
    4. Public Sub New(Name As String, PreisProEinheitInCent As Integer)
    5. Me.Name = Name
    6. Me.PreisProEinheitInCent = PreisProEinheitInCent
    7. End Sub
    8. End Class

    Das als anfängliches Gegenbeispiel.
    Dann kannst Du nämlich im Form-Code schreiben:

    VB.NET-Quellcode

    1. Dim Rose As New Artikel("Rose", 199)
    und später mit jener Rose(nsorte) bequem weitermachen.
    Allerdings muss ich an dieser Stelle aufhören, und zwar aus 2 Gründen: 1. Mir geht die Zeit aus, 2. Dir fehlen die Grundlagen für objektorientierte Programmierung. Ohne diese Dinge geht es leider nicht (bei mir weiter).
    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:

    Allerdings muss ich an dieser Stelle aufhören, und zwar aus 2 Gründen: 1. Mir geht die Zeit aus, 2. Dir fehlen die Grundlagen für objektorientierte Programmierung. Ohne diese Dinge geht es leider nicht (bei mir weiter


    Okay schade, danke auf jeden fall ich werde mich mal ran setzen und schauen wie ich das umsetzen kann.

    Das mit der Cent eingabe ist schon mal sehr gut so hab ich kein Double sondern Integer und lässt sich weiter besser bearbeiten.

    VBHunter schrieb:

    Dim PreisProNelkeInEuro As Double = 0.99
    Diese Aufzählung schreit doch nach einer DataTable!
    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!
    @VBHunter Sieh Dir mal dieses Beispiel an.
    Mach da einfach ne Boolean Spalte daneben und spiel mal damit:
    Differenz in Prozent ausrechnen
    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!