mehreren ComboBoxen eine List(Of T) zuweisen, die dann aber unabhängig voneinander agieren sollen

  • VB.NET
  • .NET (FX) 4.0

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

    mehreren ComboBoxen eine List(Of T) zuweisen, die dann aber unabhängig voneinander agieren sollen

    ausgelagert aus euklidischer Algorithmus und nachbearbeitet ~VaporiZed

    Ein Form mit einer GroupBox in der sich 5 Comboboxen befinden.
    Die Comboboxen lasse ich aus einer List(of) befüllen, weil erstmal alle die selben Einträge brauchen.
    Nun ist es so, wenn ich einen Wert, aus egal welche Combobox ich auswähle, alle anderen auch diesen Wert annehmen.
    Muss ich für jede Combobox eine eigene Liste erstellen oder??

    VB.NET-Quellcode

    1. Private Ringfarbe As List(Of Color) = Nothing
    2. Private Sub Lade_Ringfarben()
    3. Ringfarbe = New List(Of Color) From {Color.Silver, Color.Gold, Color.Black, Color.Brown, Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Violet, Color.Gray, Color.White}
    4. End Sub
    5. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. Lade_Ringfarben()
    7. Fuelle_Comboboxen()
    8. End Sub
    9. Private Sub Fuelle_Comboboxen()
    10. Dim cmb As ComboBox
    11. For Each ctl As Control In Me.GroupBox1.Controls
    12. If TypeOf ctl Is ComboBox Then
    13. cmb = DirectCast(ctl, ComboBox)
    14. cmb.DataSource = Ringfarbe
    15. End If
    16. Next
    17. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    angepasst wegen Thementrennung ~VaporiZed

    @Amelie: Schreib in Zeile#17 cmb.DataSource = Ringfarbe.ToList und jede ComboBox hat ihre eigene, unabhängige Liste.

    ##########

    @Amelie: Achso, und noch was, der Code geht einfacher:

    VB.NET-Quellcode

    1. Private Sub Fuelle_Comboboxen()
    2. For Each cmb As ComboBox In Me.GroupBox1.Controls.OfType(Of ComboBox)
    3. cmb.DataSource = Ringfarbe.ToList
    4. Next
    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.

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

    Eine Frage:
    Ich fülle ja nun die 5 Comboboxen mit den Farbwerten aus der ListOf. Ist es nun möglich, das z.B. Combobox4 nur bestimmte Einträge aus der ListOf erhält?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Tja da war ich erst so euphorisch und dann.... :(
    Es macht nur Teilweise das was es soll.
    Also ich muss 2 Combos anders befüllen, nur ist es jetzt so, das bei der 2ten auch die Farben weg sind ich ich in der ersten schon entfernt habe.

    Ich dachte es wird immer eine Neue ListOf benutzt??

    VB.NET-Quellcode

    1. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Lade_Ringfarben()
    3. Fuelle_Comboboxen()
    4. FuelleCmb_Temperatur()
    5. FuelleCmb_Toleranz()
    6. End Sub
    7. Private Sub Fuelle_Comboboxen()
    8. For Each cmb As ComboBox In Me.GroupBox1.Controls.OfType(Of ComboBox)()
    9. cmb.DataSource = Ringfarbe.ToList
    10. Next
    11. End Sub
    12. Private Sub FuelleCmb_Toleranz()
    13. Dim ListToleranz = {Color.Black, Color.White, Color.Yellow, Color.Orange}
    14. For Each item In ListToleranz
    15. Ringfarbe.Remove(item)
    16. Next
    17. cmb_toleranz.DataSource = Ringfarbe
    18. End Sub
    19. Private Sub FuelleCmb_Temperatur()
    20. Dim ListTemperatur = {Color.Gold, Color.Silver, Color.Green, Color.Gray, Color.White}
    21. For Each item In ListTemperatur
    22. Ringfarbe.Remove(item)
    23. Next
    24. cmb_temperatur.DataSource = Ringfarbe
    25. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    In Zeile#20 und #28 hast Du aber schon wieder die Zuweisung der Ursprungsliste, aus denen Du vorher Dinge entfernt hast. Du weist jeder ComboBox zuerst 11 Farben zu, dann entfernst Du aus der Ursprungsliste ein paar Farben und weist diese verkürzte Ursprungsliste der cmb_temperatur.DataSource zu und dann nimmst Du nochmal ein paar Farben raus und weist diese weiter verkürzte Ursprungsliste cmb_toleranz.DataSource zu.
    Dann mach eher:

    VB.NET-Quellcode

    1. Private Sub FuelleCmb_Toleranz()
    2. Dim ListToleranz = {Color.Black, Color.White, Color.Yellow, Color.Orange}
    3. Dim FarbenFürCmbToleranz = Ringfarbe.ToList
    4. For Each item In ListToleranz
    5. FarbenFürCmbToleranz.Remove(item)
    6. Next
    7. cmb_toleranz.DataSource = FarbenFürCmbToleranz
    8. End Sub

    oder mit LINQ:

    VB.NET-Quellcode

    1. Private Sub FuelleCmb_Toleranz()
    2. Dim ListToleranz = {Color.Black, Color.White, Color.Yellow, Color.Orange}
    3. cmb_toleranz.DataSource = Ringfarbe.Except(ListToleranz).ToList
    4. End Sub

    btw: Benennung! Ringfarbe Ist doch gar keine einzelne Farbe.
    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.
    ​Ringfarbe Ist doch gar keine einzelne Farbe

    Nicht? Ich habe 4-6 Ringe auf denen je eine Farbe ist. Also "Ringfarbe" hhmmmm??

    Das mit dem LinQ hat nicht geklappt. Kein Fehler aber die Farben wurden nicht ausgefiltert.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich weiß zwar jetzt nicht, wie Dein Codeversuch aussieht, aber ich hab mit

    VB.NET-Quellcode

    1. For Each cmb As ComboBox In Me.GroupBox1.Controls.OfType(Of ComboBox)
    2. cmb.DataSource = Ringfarbe.ToList
    3. Next
    4. Dim ListToleranz = {Color.Black, Color.White, Color.Yellow, Color.Orange}
    5. ComboBox1.DataSource = Ringfarbe.Except(ListToleranz).ToList

    das Ergebnis, welches im Anhang ist.

    Und mit der Namensgebung. Das ist ne List(Of Color). Wie kann das Teil Ringfarbe heißen? Wenn Du Dir den ersten Eintrag holst und einer Variable zuweist, wie würdest Du die Variable nennen? Mir fällt nix ein. Denn von einer Farbe kenne ich keinen 1. Teil. Oder Bestandteil oder wasauchimmer. Wenn der Datentyp Color ist, kann das Teil gerne Ringfarbe heißen. Aber der Datentyp ist List(Of Color), also eine Liste. Aber wenn Du damit klarkommst und Dich im weiteren Verlauf nicht selbst verwirrst, belass es dabei.

    Weitere Frage, diesmal als Moderator: Was hat das hier noch mit dem euklidischen Algorithmus zu tun? Wenn nix, werd ich das Thema teilen (müssen). erledigt
    Bilder
    • Box 2 ohne Filter.png

      2,66 kB, 147×200, 461 mal angesehen
    • Box 1 nach Filterung.png

      2,07 kB, 177×164, 428 mal angesehen
    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.

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

    Ja Teilen ist wohl besser. Habe das vergessen ein anderes Thema aufzumachen. Sorry.
    --
    Das mit dem LinQ teste ich nochmal aus aber die erste Variante klappte ja.
    --
    Das mit der Namensgebung.
    Ja eine ListOf Color. Diese Farben werden Objekten ( Ringen => PictureBox ) zugewiesen, welche dann diese Farben annehmen. Jede Farbe steht dann für einen bestimmten Zahlenwert mit dem ich später noch rechnen muß.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    VaporiZed schrieb:

    Benennung! Ringfarbe Ist doch gar keine einzelne Farbe.
    Was VaporiZed meint: Deine Private Ringfarbe As List(Of Color) ist keine einzelne Farbe, sonder eine Auflistung davon.

    Amelie schrieb:

    Ja eine ListOf Color. Diese Farben...
    Hier redest du ja auch von Farben, nicht von einer einzelnen Farbe. Dementsprechend sollte deine List(Of Color) Ringfarben statt Ringfarbe heißen.
    @Schmittmuthelm @VaporiZed
    Ach jetzt weiß ich was Ihr meint. Ja könnte man in die "Mehrzahl" ändern.
    Ich habe das so betrachtet, das jeder Ring bei Auswahl eben nur EINE FARBE hat ..deswegen Einzahl.
    -----
    OK jetzt habe ich ein Problem beim Rechnen mit Exponenten.
    Alles geht soweit bis auf die letzen beiden: 10^-1 und 10^-2
    Da kommt immer 0 (Null) raus. Also wenn ich mir den Wert von NewMultiplikator ausgeben lasse steht eine 0 drin.
    Fange gerade erst an mit VB.Net zu rechen ;)

    VB.NET-Quellcode

    1. Friend Exponent() As Double = {10 ^ 0, 10 ^ 1, 10 ^ 2, 10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6, 10 ^ 7, 10 ^ 8, 10 ^ 9, 10 ^ -1, 10 ^ -2}
    2. Friend Sub AuswahlRechnen()
    3. Select Case AktlStandardRinge
    4. Case Ringanzahl.Vier_Ringe
    5. Dim NewMultiplikator As Integer = CInt(Exponent(Multiplikator))
    6. berechnen(Zehner, Einer, NewMultiplikator)
    7. Case Ringanzahl.Fünf_Ringe
    8. 'ToDo ....
    9. '....
    10. End Select
    11. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Integer = Ganzzahl
    Was ergibt 10^-1 als Berechnungsergebnis?
    Was ergibt 10^-2?
    Und dann kannst Du nochmal überlegen, warum da immer 0 rauskommt.
    Oder anders: Was erwartest Du denn, was in NewMultiplikator bei 10^-1 und 10^-2 drinsteht, wenn NewMultiplikator immer nur ganze Zahlen aufnehmen kann, eben weil Du es As Integer deklariert hast?

    und: Wenn das wieder ein neues Thema wird, nicht dauernd das alte fortsetzen. Für die Moderation ist es immer ziemlicher Aufwand, (Deine) Threads zu teilen.
    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.
    Moin moin

    Nein es gehört zum selben Thema.

    Habe nun den Integer nach Double gewechselt und es klappt aber eins verstehe ich nicht.

    VB.NET-Quellcode

    1. ​Dim NewMultiplikator As Double = Exponent(CInt(Multiplikator))

    Warum muss ich in der Klammer dann doch wieder (CInt(Multiplikator)) machen?
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Exponent ist ein Double-Array. Also Exponenten. Oder vielleicht gar MöglicheExponenten? Auf jeden Fall Plural, da in dem Ding mehrere Werte drinstecken. Leicht zu merken. Wenn eine Variable mehrere gleichwertige Dinge beinhaltet, dann Plural.
    Mit Exponent(CInt(Multiplikator)) rufst Du den xten Eintrag des Arrays auf. Arrayindizes sind IMMER Ganzzahlen, also Integer. Wenn das Ding in Klammern nach Exponent aber kein Integer ist, muss man einen draus machen. Denn z.B. die Angabe: »Compiler, gib mir den 3,1415ten Eintrag einer Liste oder eines Arrays« ist nicht sinnvoll.
    Von welchem Datentyp ist denn Multiplikator?
    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.
    Ahja, verstehe:
    Die einzelnen Zahlen (die Auflistung) in dem Array sind "Ganzzahlen" also Integer; die Berechnung mit den WERTEN davon sind Kommazahlen also Double ??
    So richtig?

    Das habe ich bisher in meiner Klasse was auch funktioniert. Bin jetzt dabei das mit den Toleranzen zu machen.
    Da ich eh nicht so mit Mathe bin und das in VB auch noch nie gemacht habe ist das echt alles schwer.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class widerstand
    2. Friend widerstand As Double
    3. Friend maßeinheit As String
    4. Friend temp_koeffizient As String
    5. Friend toleranz As Double
    6. Friend toleranzende As Double
    7. Friend toleranzbegin As Double
    8. Friend Hunderter As Integer
    9. Friend Zehner As Integer
    10. Friend Einer As Integer
    11. Friend Multiplikator As Double
    12. Friend AktlStandardRinge As Ringanzahl = Ringanzahl.Fünf_Ringe
    13. Friend Sub AnzahlRinge_wechseln()
    14. If AktlStandardRinge = Ringanzahl.Vier_Ringe Then AktlStandardRinge = Ringanzahl.Fünf_Ringe Else AktlStandardRinge = Ringanzahl.Vier_Ringe
    15. End Sub
    16. Friend Exponent() As Double = {10 ^ 0, 10 ^ 1, 10 ^ 2, 10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6, 10 ^ 7, 10 ^ 8, 10 ^ 9, 10 ^ -1, 10 ^ -2}
    17. Friend Sub AuswahlRechnen()
    18. Select Case AktlStandardRinge
    19. Case Ringanzahl.Vier_Ringe
    20. Dim NewMultiplikator As Double = Exponent(CInt(Multiplikator))
    21. berechnen(Zehner, Einer, CDbl(NewMultiplikator))
    22. Case Ringanzahl.Fünf_Ringe
    23. 'ToDo ....
    24. End Select
    25. End Sub
    26. Friend Function berechnen(ByVal Zehner As Integer, ByVal Einer As Integer, ByVal Multiplikator As Double) As Double
    27. Dim Zwischensumme As Double = CInt(Zehner & Einer)
    28. widerstand = Zwischensumme * Multiplikator
    29. If Multiplikator = 10 ^ -1 OrElse Multiplikator = 10 ^ -2 Then
    30. maßeinheit = "Ω"
    31. widerstand = widerstand * 1
    32. ElseIf Multiplikator = 10 ^ 2 OrElse Multiplikator = 10 ^ 3 OrElse Multiplikator = 10 ^ 4 Then
    33. maßeinheit = "kΩ"
    34. widerstand = widerstand / 1000
    35. ElseIf Multiplikator = 10 ^ 5 OrElse Multiplikator = 10 ^ 6 OrElse Multiplikator = 10 ^ 7 Then
    36. maßeinheit = "MΩ"
    37. widerstand = widerstand / 1000000
    38. ElseIf Multiplikator = 10 ^ 8 OrElse Multiplikator = 10 ^ 9 Then
    39. maßeinheit = "GΩ"
    40. widerstand = widerstand / 1000000000
    41. End If
    42. Return CInt(widerstand)
    43. End Function
    44. End Class
    45. Friend Enum Ringanzahl
    46. Vier_Ringe
    47. Fünf_Ringe
    48. End Enum

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Die einzelnen Zahlen (die Auflistung) in dem Array sind "Ganzzahlen" also Integer; die Berechnung mit den WERTEN davon sind Kommazahlen also Double ??
    Nö.
    Die einzelnen Zahlen sind auch Kommazahlen, legst du ja selbst mit Exponent() As Double fest.

    Ein einzelnes Element aus dem Array sprichst du über einen Index an, ein Index ist immer eine Ganzzahl.

    Index
    Wert
    0
    10 ^ 0
    1
    10 ^ 1
    2
    10 ^ -2

    Du kannst Dir auch Papier und Stift nehmen und dann schreib
    1. 10^0
    2. 10^1
    3. 10^2
    4. 10^4
    5. 10^5
    usw; wenn Du schreibst Exponent(0), dann sucht sich der Compiler den 1. Eintrag aus Deiner Liste raus, wenn Du schreibst Exponent(1), dann sucht sich der Compiler den 2. Eintrag aus Deiner Liste raus. Aber wenn Du schreibst Exponent(Multiplikator) und Multiplikator ist an der Stelle 8,3, dann nörgelt der Compiler zurecht rum, weil es keinen 8,3ten Eintrag in dieser Liste gibt.

    ##########

    8|
    Dein Code ist aber stark ausbaufähig.
    Muss das alles Public/Friend sein? Kann das nicht tw. auch nur Private oder gar lokal in den Methoden sein?

    VB.NET-Quellcode

    1. Dim Zwischensumme As Double = CInt(Zehner & Einer)
    Was soll das inhaltlich bedeuten?* Und warum wandelst Du das Ding in Klammern in einen Integer um, um es dann einer Double-Variable zuzuweisen?
    widerstand = widerstand * 1 - Diese Zeile macht mathematisch nix, könnte also weg.
    berechnen(Zehner, Einer, CDbl(NewMultiplikator)) - Die Konvertierung von NewMultiplikator in ein Double mittels CDbl ist unnötig. NewMultiplikator ist doch schon ein Double.
    Return CInt(widerstand) - obwohl die Function ein Double-Wert wiedergeben soll?

    * es wundert mich, dass Option Strict On sowas tatsächlich überhaupt akzeptiert!
    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.

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

    Das mit den Exponenten (Integer & Double) habe ich jetzt verstanden.

    Ja der Code ist sicher noch sehr ausbaufähig aber ich mache das mit dem Rechnen etc das erste mal.
    Das Int bei Zehner & Einer & Return habe ich schon geändert, war noch befor ich das auf Double setzte. Hatte ich vergessen.

    Muss das alles Public/Friend sein?
    Naja das will ich sehen wie ich das ggf anders machen kann.

    Was soll das inhaltlich bedeuten?
    Da kommen die Comboboxen. Mit jeder wähle ich eine Farbe aus die einen bestimmten Zahlen-Wert hat und aus diesen Einzelwerten muss ich nun eine Ganzzahl machen mit der ich dann weiter rechnen kann. Toleranzen usw...und einmal mit 4 Ringen und 5 Ringen (Comboboxen)
    4Ringe
    berechnen(Zehner, Einer, CDbl(NewMultiplikator)) <= Zehner & Einer & Multiplikator
    5Ringe
    berechnen(Hunderter, Zehner, Einer, CDbl(NewMultiplikator)) <= Hunderter & Zehner & Einer & Multiplikator

    Hier versuche ich einiges von dem neu erlerntem OOP umzusetzen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Nur um Dir klarzumachen, was Dein Code derzeit an dieser einen Stelle tut:

    VB.NET-Quellcode

    1. Friend Function berechnen(ByVal Zehner As Integer, ByVal Einer As Integer, ByVal Multiplikator As Double) As Double
    2. Dim Zwischensumme As Double = CInt(Zehner & Einer)

    Die 2. Zeile sagt: Wandle die Ganzzahl Zehner in einen Text um, wandle die Ganzzahl Einer in einen Text um, füge diese beiden Texte zusammen, wandle den zusammengesetzten Text in eine Ganzzahl um und packe diesen Wert in die Kommazahlvariable Zwischensumme. Wenn es das ist, was Du wirklich willst, ok. Aber ich wage es zu bezweifeln. Ich glaube, dass Du wolltest, dass Zehner uns Einer addiert werden und die Summe der beiden in die Variable Zwischensumme soll. Wenn dem so ist, musst Du einfach nur schreiben: Dim Zwischensumme As Double = Zehner + Einer
    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.
    Hmmm Jetzt bin ich echt verwirrt. ;(
    Habe das mal mit diesen Einstellungen gemacht: Rot / Grün / Rot

    Combobox1 = Rot2 und ComboBox2 = Grün5 ===> Aus den Farben
    Ringfarbe = New List(Of Color) From {Color.Black, Color.Brown, Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Violet, Color.Gray, Color.White, Color.Gold, Color.Silver}

    ComboBox3 (Rot) aus den Exponenten = 10^2
    Dim Exponenten() As Double = {10 ^ 0, 10 ^ 1, 10 ^ 2, 10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6, 10 ^ 7, 10 ^ 8, 10 ^ 9, 10 ^ -1, 10 ^ -2}

    Nach dem rechnen wirft der Code das aus:
    Dim Zwischensumme As Double = CInt(Zehner & Einer) = 2500
    Dim Zwischensumme As Double = Zehner + Einer = 700
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh: