Combobox Problem

  • VB.NET
  • .NET (FX) 4.0

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Combobox Problem

    Ich habe auf einer Form bis zu 8 Comboboxen( je nach Anzahl der ausgewählten Spieler), welche gebunden sind.
    Nun kann es ja mal passieren das ein Spieler doppelt ausgewählt wird. Siehe Bild im Anhang , Spieler 1 und Spieler 2 haben den selben Namen.
    Ist es möglich den Hintergrund der Combobox farblich zu ändern wenn Namen doppelt sind?
    Bilder
    • Spieler.png

      29,6 kB, 1.579×737, 127 mal angesehen
    Bestimmt... hat die Combobox ne. BackColor Eigenschaft? Falls ja, lässt die sich wahrscheinlich zur Laufzeit setzen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Hallo
    Vielen Dank für eure Antworten
    Meine Frage war falsch gestellt.
    Wenn z.B.Combobox 1 und Combobox 2 gleich sind habe ich das mit dem Backcolor. Mit einer If Abfrage
    Wenn ich jetzt aber alle maximal 8 Boxen vergleiche, wird das ja ein "Riesengefummel".
    Darum dachte ich, frage mal die Spezis, eventuell gibt es einen einfacheren Weg.
    Vergleiche alle relevanten ComboBoxen per Schleife miteinander:

    VB.NET-Quellcode

    1. Dim FoundSameContent = False
    2. For Each RefControl As Control In Controls
    3. If TypeOf RefControl IsNot ComboBox Then Continue For
    4. FoundSameContent = False
    5. For Each Control As Control In Controls
    6. If TypeOf Control IsNot ComboBox OrElse RefControl Is Control Then Continue For
    7. If DirectCast(RefControl, ComboBox).SelectedIndex = DirectCast(Control, ComboBox).SelectedIndex Then FoundSameContent = True : Exit For
    8. Next
    9. If FoundSameContent Then
    10. RefControl.BackColor = Drawing.Color.Red
    11. Else
    12. RefControl.BackColor = Drawing.Color.Green
    13. End If
    14. Next

    Der Code setzt voraus, dass alle ComboBoxen miteinander verglichen werden sollen (wenn nicht, mach Dir ein Array/eine List(Of ComboBox), wo alle relevanten ComboBoxen vorher reingepackt werden) und dass der SelectedIndex als Unterscheidngskriterium hergenommen werden kann.
    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.
    und jetzt das ganze nochmal schnucklig formuliert mit Linq und pipapo:

    VB.NET-Quellcode

    1. Private Sub MarkupSelectedIndexDublettes()
    2. Dim groups = From combo In Me.Controls.OfType(Of ComboBox)() Group By combo.SelectedIndex Into Combos = Group
    3. For Each grp In groups
    4. Dim backCol = If(grp.Combos.Count = 1, Color.YellowGreen, Color.Orange)
    5. For Each cmb In grp.Combos
    6. cmb.BackColor = backCol
    7. Next
    8. Next
    9. End Sub
    Vorgehensweise: Die Combos werden nach SelectedIndex gruppiert. Gruppen, bestehend aus mehr als 1 Combo sind logischerweise Dubletten.

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

    Mein Vorschlag noch, da die ComboBoxen wohl in GroupBoxen liegen:

    VB.NET-Quellcode

    1. Private Sub BtnMarkDuplicates_Click(sender As Object, e As EventArgs) Handles BtnMarkDuplicates.Click
    2. Dim ComboBoxList As New List(Of ComboBox)
    3. PutAllVisibleGroupBoxesTo(ComboBoxList, Me)
    4. ColorizeComboBoxesWithSameContentUsing(ComboBoxList)
    5. End Sub
    6. Private Sub PutAllVisibleGroupBoxesTo(ComboBoxList As List(Of ComboBox), Control As Control)
    7. For Each ChildControl As Control In Control.Controls
    8. If ChildControl.Visible AndAlso TypeOf ChildControl Is ComboBox Then ComboBoxList.Add(DirectCast(ChildControl, ComboBox))
    9. PutAllVisibleGroupBoxesTo(ComboBoxList, ChildControl)
    10. Next
    11. End Sub
    12. Private Sub ColorizeComboBoxesWithSameContentUsing(ComboBoxList As List(Of ComboBox))
    13. Dim FoundSameContent = False
    14. For Each RefComboBox In ComboBoxList
    15. FoundSameContent = False
    16. For Each ComboBox In ComboBoxList
    17. If RefComboBox Is ComboBox Then Continue For
    18. If RefComboBox.SelectedIndex = ComboBox.SelectedIndex Then FoundSameContent = True : Exit For
    19. Next
    20. RefComboBox.BackColor = If(FoundSameContent, Color.Salmon, Color.LightGreen)
    21. Next
    22. End Sub

    Anmerkung bzgl. der Prozedurnamen: Ich verwende immer wieder solche Namen, die den 1. Parameter quasi in den Namen mit einbeziehen. Daher sehen die auf Anhieb etwas komisch aus. Ich konnte mich nocht nicht endgültig entscheiden, ob ich das bei allen Projekten durchziehe, aber innerhalb eines Projektes ist es konsequent.
    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:

    Anmerkung bzgl. der Prozedurnamen
    Ich finde derlei Namen extrem anstrengend zu lesen.
    Ich glaub, bei mehr als 3 TeilWorten sollte man vom Casing abrücken zugunsten einer eher java-mäßigen NamensKonstruktion - Vergleiche

    VB.NET-Quellcode

    1. Private Sub BtnMarkDuplicates_Click(sender As Object, e As EventArgs) Handles BtnMarkDuplicates.Click
    2. Dim ComboBoxList As New List(Of ComboBox)
    3. PutAllVisibleGroupBoxesTo(ComboBoxList, Me)
    4. ColorizeComboBoxesWithSameContentUsing(ComboBoxList)
    5. End Sub
    6. Private Sub ColorizeComboBoxesWithSameContentUsing(ComboBoxList As List(Of ComboBox))
    7. Dim FoundSameContent = False
    8. For Each RefComboBox In ComboBoxList
    9. FoundSameContent = False
    10. For Each ComboBox In ComboBoxList
    11. If RefComboBox Is ComboBox Then Continue For
    12. If RefComboBox.SelectedIndex = ComboBox.SelectedIndex Then FoundSameContent = True : Exit For
    13. Next
    14. RefComboBox.BackColor = If(FoundSameContent, Color.Salmon, Color.LightGreen)
    15. Next
    16. Private Sub PutAllVisibleGroupBoxesTo(ComboBoxList As List(Of ComboBox), Control As Control)
    17. For Each ChildControl As Control In Control.Controls
    18. If ChildControl.Visible AndAlso TypeOf ChildControl Is ComboBox Then ComboBoxList.Add(DirectCast(ChildControl, ComboBox))
    19. PutAllVisibleGroupBoxesTo(ComboBoxList, ChildControl)
    20. Next
    21. End Sub
    22. ' mit
    23. Private Sub BtnMarkDuplicates_Click(sender As Object, e As EventArgs) Handles BtnMarkDuplicates.Click
    24. Dim ComboBoxList As New List(Of ComboBox)
    25. Put_All_Visible_GroupBoxes_To(ComboBoxList, Me)
    26. Colorize_ComboBoxes_With_Same_Content_Using(ComboBoxList)
    27. End Sub
    28. Private Sub Colorize_ComboBoxes_With_Same_Content_Using(ComboBoxList As List(Of ComboBox))
    29. Dim FoundSameContent = False
    30. For Each RefComboBox In ComboBoxList
    31. FoundSameContent = False
    32. For Each ComboBox In ComboBoxList
    33. If RefComboBox Is ComboBox Then Continue For
    34. If RefComboBox.SelectedIndex = ComboBox.SelectedIndex Then FoundSameContent = True : Exit For
    35. Next
    36. RefComboBox.BackColor = If(FoundSameContent, Color.Salmon, Color.LightGreen)
    37. Next
    38. Private Sub Put_All_Visible_GroupBoxes_To(ComboBoxList As List(Of ComboBox), Control As Control)
    39. For Each ChildControl As Control In Control.Controls
    40. If ChildControl.Visible AndAlso TypeOf ChildControl Is ComboBox Then ComboBoxList.Add(DirectCast(ChildControl, ComboBox))
    41. Put_All_Visible_GroupBoxes_To(ComboBoxList, ChildControl)
    42. Next
    43. End Sub
    wobei in java glaub durchgängig klein geschrieben wird - aber das täte zum Casing-Naming net mehr passe.
    Das ist jetzt etwas offtopic, aber allzu lange wird es ja nicht gehen.
    Hm ... ok. Nehm ich zur Kenntnis und kann ich verstehen. Meine Anmerkung ging allerdings eher in Richtung Einbeziehung des 1. Parameters. Deine Meinung dazu?
    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.
    jo - wenn man das Prinzip verstanden hat, kann man sich glaub dran gewöhnen, so zu lesen.
    Wobei ich Markup_SelectedIndex_Dublettes(comboBoxes) immer noch leichter verständlich finde als Colorize_ComboBoxes_With_Same_Content_Using(comboBoxes) - insbesondere wg _Using, was bei mir ne ganz anneren Thematik assoziiert.

    Aber dassis'n Einzelschicksal... ;)