3 Kleinsten werte aus xxx Labeln ermitteln und Farblich darstellen

  • VB.NET
  • .NET 4.5

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Oxy_Modz.

    3 Kleinsten werte aus xxx Labeln ermitteln und Farblich darstellen

    Moin , ich habe einen ganzen haufen an Labels die mir zahlen ausgeben
    ich möchte nun , das die 3 kleinsten werte mir GRÜN angezeigt werden!

    2. Problem ist, das mein label so denn wert 0.00 angibt
    aber sobald da zb 2.60 steht , wird die 0 NICHT mit angezeigt
    wie kann ich das verändert, das die 0 auch mit angezeigt wird?

    ich bin komplett neu in diesem bereich :D
    sry für die evlt dummen/einfachen fragen :X
    danke für die schnelle antwort
    die zahlen kommen so zustande:
    textbox * textbox + textbox * texbox

    VB.NET-Quellcode

    1. cartogomiete0.Text = CType(CType(Val(streckemin.Text) * Val(cartogopreis0.Text) + Val(parkzeit.Text) * Val(cartogoparkpreis.Text), String), String)

    bitte frag nicht warum das so aussieht :X vb.net wollte das so :D


    VB.NET-Quellcode

    1. Dim number As Single = 2.6F
    2. cartogomiete0.Text = number.ToString("0.00")


    hab das so gemacht , aber keine Veränderung :O
    Trenne GUI von Daten, Control-Properties sind kein Parkplatz für Werte. Lege variablen an und lass die labels deren Werte anzeigen, das ist der richtige Weg, so kommt doch nur ein MarmeladenBrot mit Essig und Senf raus.

    Oxy_Modz schrieb:

    bitte frag nicht warum das so aussieht :X vb.net wollte das so


    Nein, du wolltest es so, du hast wie verrückt die automatische Korrektur angewendet.

    VB.NET-Quellcode

    1. Dim wert1 As Single = 2.757
    2. Dim wert2 As Single = 3.875484
    3. Label1.Text = wert1.ToString("0.00")
    4. Label2.Text = wert2.ToString("0.00")
    5. Dim wert3 As Single = wert1 + wert2
    6. Label3.Text = wert3.ToString("0.00")


    Bring das erstmal in Ordnung, danach bin ich bereit dir weiter zu helfen, ich mag kein MarmeladenBrot mit Essig und Senf.
    okey danke für die antwort

    ich habe 12 labels wo ein wert raus kommt
    muss ich dann für alle 12 das so machen :

    VB.NET-Quellcode

    1. Dim wert1 As Single = 2.757
    2. Dim wert2 As Single = 3.875484
    3. Label1.Text = wert1.ToString("0.00")
    4. Label2.Text = wert1.ToString("0.00")
    5. Dim wert3 As Single = wert1 + wert2
    6. Label3.Text = wert3


    aber ich versteh das ganze noch nicht ganz!
    ich habe 1 textbox1 da kommt ein wert rein!
    diese textbox1 * eine textbox2 wo ein fester wert drin ist + eine textbox3 wo ein wert rein kommt * eine textbox4 wo ein fester wert drin ist = label1

    und die 2 zahlen da : 2.757 & 3.875484
    sind ja deine zahlen , er soll die zahlen aus einer textbox nehmen
    schreibe ich dann statt die zahl dann textbox.text hin?

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

    Da bei textBoxen Usereingaben stattfinden, muss versucht werden das zu parsen, kann sonst schnell mal eine Exception geworfen werden (never trust user-input). So parst du richtig:

    VB.NET-Quellcode

    1. Dim wert1 As Single = 0
    2. If Not Single.TryParse(TextBox1.Text, wert1) Then
    3. MessageBox.Show("Ungültiger Wert in TextBox1")
    4. Else
    5. MessageBox.Show(wert1.ToString("0.00"))
    6. End If
    7. Dim wert2 As Integer = 0
    8. If Not Integer.TryParse(TextBox2.Text, wert2) Then
    9. MessageBox.Show("Ungültiger Wert in TextBox2")
    10. Else
    11. MessageBox.Show(wert2.ToString)
    12. End If

    okey das hab ich soweit verstanden , ABER
    das ganze ist so aufgebaut:
    textbox1 * textbox2 + textbox3 * textbox4 = label1

    nur in textbox1 und textbox3 kann was reingeschrieben werden!
    textbox2 und textbox4 haben feste werte , die vom user nicht geändert werden können!


    Vollzitat entfernt
    -Artentus

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

    Dann dienen diese ja wiederrum als Parkplatz für Werte was falsch ist.

    Also ein wenig Fleissarbeit dann passt das:

    VB.NET-Quellcode

    1. 'irgendwo eine globale variable wert3
    2. Dim wert1 As Single = 0
    3. If Not Single.TryParse(TextBox1.Text, wert1) Then
    4. MessageBox.Show("Ungültiger Wert in TextBox1")
    5. Return 'die sub wird hierdurch sofort verlassen
    6. Else
    7. MessageBox.Show(wert1.ToString("0.00"))
    8. End If
    9. Dim wert2 As Integer = 0
    10. If Not Integer.TryParse(TextBox2.Text, wert2) Then
    11. MessageBox.Show("Ungültiger Wert in TextBox2")
    12. Return
    13. Else
    14. MessageBox.Show(wert2.ToString)
    15. End If
    16. wert3 = wert2 - wert1
    17. MessageBox.Show(wert3.ToString)

    Oxy_Modz schrieb:

    ich habe 12 labels wo ein wert raus kommt
    Überleg zunächst, was Du ühaupt machst:
    Aus Labeln kommt kein Wert raus, sondern ein String rein.
    Wenn Du solch elementare Dinge erkennst, kannst Du Deine Probleme wesentlich präziser formulieren. ;)
    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!

    VB.NET-Quellcode

    1. Dim wert1 As Single = 2.757
    2. Dim wert2 As Single = 3.875484
    3. Label1.Text = wert1.ToString("0.00")
    4. Label2.Text = wert2.ToString("0.00")
    5. Dim wert3 As Single = wert1 + wert2
    6. Label3.Text = wert3.ToString("0.00")


    ich komme damit irgendwie noch nicht zurecht :D

    VB.NET-Quellcode

    1. bei mir sieht es bis jetzt so aus:
    2. Dim wert1 As Single = cartogopreis0.text
    3. Dim wert2 As Single = cartogopreis1.text
    4. Dim wert3 As Single = cartogopreis2.text
    5. Dim wert4 As Single = cartogopreis3.text
    6. Dim wert5 As Single = cartogoparkpreis.text
    7. Dim wert6 As Single = streckemin.text
    8. Dim wert7 As Single = parkzeit.text


    nun weiß ich aber nicht weiter :D

    VB.NET-Quellcode

    1. "Label1.Text = wert1.ToString("0.00")"


    das verwirt mich mega :D
    da label1 ja nicht cartogopreis0 ist

    er soll ja wert5 * wert1 + wert6 * wert5 = label1

    also:

    VB.NET-Quellcode

    1. Dim wert8 As Single = wert5 * wert1 + wert6 * wert5
    2. label1.text = wert8


    oder?

    und wie sage ich ihm jetzt das label1.text zahlen wie 2.80 ausgibt ( bei mir gibt er es nur so aus : 2.8 , also ohne die 0 )
    Die Benamung deiner Variablen muss nicht fortlaufend wert... sein. Da kannst du ruhig ein wenig kreativer sein. Vergiss das parsen nicht, schreib auch für alle Fälle mal in die allererste Zeile Option Strict On. Dann wirst du drauf aufmerksam gemacht, falls du mal Birnen mit Bananen verwechselst. Strings sind keine numerischen Werte, auch wenn der Text nur Zahlen enthält.

    VB.NET-Quellcode

    1. Dim wert1 As Single
    2. If Not Single.TryParse(TextBox1.Text, wert1) Then
    3. Return 'die sub wird hierdurch sofort verlassen
    4. End If
    5. 'Wenn erfolgreich geparst wurde hat wert1 den Wert der als Text in der TextBox zu sehen ist


    das verwirt mich mega

    da label1 ja nicht cartogopreis0 ist


    Label1 war auch nur Exemplarisch. Ich will ja nicht deinen Code schreiben, sondern nur helfen das du es selbst schaffst.

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

    Oxy_Modz schrieb:

    Dim wert1 As Single = cartogopreis0.text
    Machst Du Option Strict On. Visual Studio - Empfohlene Einstellungen
    Was könnte Dim wert1 As Single = cartogopreis0.text sein, wenn da "Roulade mit Klößen" drinne steht?
    Der Umfang der Roulade oder das Alter des Kochs?

    RodFromGermany schrieb:

    Überleg zunächst, was Du ühaupt machst
    Tue 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).
    VB-Fragen über PN / Konversation werden ignoriert!
    okey danke , das klappt jetzt alles , muss das noch für den rest fertig machen

    nun die 2. frage , wie kann ich mir die 3 kleinsten werte anzeigen lassen?
    und diese grün ausgeben?


    @edit
    @RodFromGermany

    ich hab Option Strict On drin

    und ist das jetzt so besser:

    VB.NET-Quellcode

    1. Dim smart As Single = CSng(smartpreis.Text)
    2. Dim aklasse As Single = CSng(aklassepreis.Text)
    3. Dim bklasse As Single = CSng(bklassepreis.Text)
    4. Dim cla_gla As Single = CSng(cla_glapreis.Text)
    5. Dim parkpreis As Single = CSng(cartogoparkpreis.Text)
    6. Dim strecke As Single = CSng(streckemin.Text)
    7. Dim parkzeit As Single = CSng(parkzeitinmin.Text)
    8. Dim mietesmart As Single = strecke * smart + parkzeit * parkpreis
    9. smartmietpreis.Text = mietesmart.ToString("0.00")
    10. Dim mieteaklasse As Single = strecke * aklasse + parkzeit * parkpreis
    11. aklassemietpreis.Text = mieteaklasse.ToString("0.00")
    12. Dim mietebklasse As Single = strecke * bklasse + parkzeit * parkpreis
    13. bklassemietpreis.Text = mietebklasse.ToString("0.00")
    14. Dim mietecla_gla As Single = strecke * cla_gla + parkzeit * parkpreis
    15. cla_glamietpreis.Text = mietecla_gla.ToString("0.00")


    Vollzitat entfernt
    -Artentus

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

    Oxy_Modz schrieb:

    und ist das jetzt so besser
    Nö.

    NoIde schrieb:

    VB.NET-Quellcode

    1. Dim wert1 As Single
    2. If Not Single.TryParse(TextBox1.Text, wert1) Then
    3. Return 'die sub wird hierdurch sofort verlassen
    4. End If
    5. 'Wenn erfolgreich geparst wurde hat wert1 den Wert der als Text in der TextBox zu sehen ist
    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!
    also so:

    VB.NET-Quellcode

    1. Dim strecke As Single = 0
    2. If Not Single.TryParse(streckemin.Text, strecke) Then
    3. MessageBox.Show("Ungültiger Wert in Streck in MIN")
    4. Return 'die sub wird hierdurch sofort verlassen
    5. Else
    6. MessageBox.Show(mietesmart.ToString("0.00"))
    7. End If
    8. Dim parkzeit As Integer = 0
    9. If Not Integer.TryParse(parkzeitinmin.Text, parkzeit) Then
    10. MessageBox.Show("Ungültiger Wert in Parkzeit in MIN")
    11. Return
    12. Else
    13. MessageBox.Show(parkzeit.ToString("0.00"))
    14. End If


    wobei strecke und parkzeit bei mir rot sind , aber warum?


    Vollzitat entfernt
    -Artentus

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

    Oxy_Modz schrieb:

    aber warum?
    Da musst Du mal Deinen Code durchsuchen. Hier steht davon nix.
    Vielleicht nimmst Du ein NumericUpDown-Control zur Vorgabe numerischefr Werte, die sind vom Typ Decimal, die musst Du nur nach Deinem Typ casten und feddch.
    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 was? :D

    also irgendwie hat er ein problem damit das da = 0 steht

    1. frage , wie kann ich es verhindert das er ein Fehler ausgibt wenn die textbox leer ist oder das er genau dann die Meldung einzeigen soll , wenn die textbox leer

    2. frage, in der textbox ist standartmässig eine 0 drin , ich möchte das wenn man da reinklickt die 0 markiert ist und man gleich los schreiben kann ohne erst die 0 zulöschen...


    Vollzitat entfernt
    -Artentus

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

    Oxy_Modz schrieb:

    1. frage , wie kann ich es verhindert das er ein Fehler ausgibt wenn die textbox leer ist oder das er genau dann die Meldung einzeigen soll , wenn die textbox leer


    Das machst du so:(Vorm dem parsen)

    VB.NET-Quellcode

    1. If String.IsNullOrEmpty(TextBox1.Text) Then
    2. Return
    3. End If


    Oxy_Modz schrieb:

    ohne erst die 0 zulöschen...


    VB.NET-Quellcode

    1. Private Sub TextBox1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseClick
    2. TextBox1.SelectAll()
    3. End Sub






    Wobei du ja nicht den Werte in der MessageBox anzeigen lassen musst, wollte dir nur so verdeutlichen das die Variable dann den wert hat. Die MessageBox anzuzeigen wegen einer Fehlerhaften eingabe macht sinn. Da ich gleich zu tun habe(Daddeln) und du zumindest schonmal auf dem richtigen Weg zu sein scheinst, hier wie du die niedrigsten Werte markiert bekommst. Funktioniert auch wenn Werte mehrfach vorkommen. Schau es dir erst an, wenn du das soweit gemacht hast.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Irgendwas()
    2. Dim helper As New Dictionary(Of Label, Single)
    3. Dim wert1 As Single = 1.01
    4. Dim wert2 As Single = 1.0
    5. Dim wert3 As Single = 1.0
    6. Dim wert4 As Single = 1.1
    7. Dim wert5 As Single = 1.01
    8. Dim wert6 As Single = 0.99
    9. Label1.Text = wert1.ToString("0.00")
    10. helper.Add(Label1, wert1)
    11. Label2.Text = wert2.ToString("0.00")
    12. helper.Add(Label2, wert2)
    13. Label3.Text = wert3.ToString("0.00")
    14. helper.Add(Label3, wert3)
    15. Label4.Text = wert4.ToString("0.00")
    16. helper.Add(Label4, wert4)
    17. Label5.Text = wert5.ToString("0.00")
    18. helper.Add(Label5, wert5)
    19. Label6.Text = wert6.ToString("0.00")
    20. helper.Add(Label6, wert6)
    21. For Each lbl As Label In helper.Keys
    22. lbl.BackColor = SystemColors.Control
    23. ' wenn vorher die hintergrundfarbe geändert wurde,
    24. 'und das Label nicht einen der niedrigsten Werte anzeigt
    25. ' soll es ja die normale hintergrundfarbe haben
    26. Next
    27. Dim howMany As Integer = 1
    28. Dim lowest() As Single = (From valuePair In helper Order By valuePair.Value Select valuePair.Value Distinct).Take(howMany).ToArray
    29. helper = (From valuePair In helper Select valuePair Where valuePair.Value <= lowest(lowest.Length - 1)).ToDictionary(Function(pair) pair.Key, Function(pair) pair.Value)
    30. For i = 0 To helper.Count - 1
    31. helper.Keys.ElementAt(i).BackColor = Color.Green
    32. Next
    33. End Sub


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

    Oxy_Modz schrieb:

    ähm was?
    In dem hier von Dir vorgestellten Code kommt keine Farbe vor.
    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!
    riesen dank und auch noch ein riesen dank , das du dir die zeit nimmst und mir so hilfst und das beim zocken :O
    was zockst du so?

    ich hab das soweit fertig und geht auch 1A :D

    meine nächste frage wäre , ich mach ich das , das er die 3 kleinsten mir anzeigt?


    @edit :D
    Dim howMany As Integer = 3 auf 3 stellen , sry für die dumme frage xD

    1. frage , wie kann ich es verhindert das er ein Fehler ausgibt wenn die textbox leer ist oder das er genau dann die Meldung einzeigen soll , wenn die textbox leer

    2. frage, in der textbox ist standartmässig eine 0 drin , ich möchte das wenn man da reinklickt die 0 markiert ist und man gleich los schreiben kann ohne erst die 0 zulöschen...


    Vollzitat entfernt
    -Artentus

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