ComboBox Farb auswahl

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Andrejd1987.

    ich habe doch das per Designer in die Form gezogen nur wie gesagt zeigt er nix an leider

    auch mit xtts02

    VB.NET-Quellcode

    1. Private WithEvents Class11 As New Class1
    2. Private Sub colorladen()
    3. Dim allColors() As KnownColor = CType([Enum].GetValues(GetType(KnownColor)), KnownColor())
    4. Class11.DataSource = allColors
    5. 'For Each c As KnownColor In allColors
    6. ' Class11.Items.Add(c.ToString)
    7. 'Next
    8. End Sub


    mfg Andrejd
    Das Private WithEvents... kannste weglassen, wenn du es im Designer auf die Form gezogen hast.

    @xtts02
    Wenn schon mit DataSource, dann so: ComboBox1.DataSource = [Enum].GetValues(GetType(KnownColor))

    xtts02 schrieb:

    Und welchen Namen hat der über den Designer hinzugefügte Instanz?
    na Class1 oder was meinst du ?

    Edit:
    mit

    VB.NET-Quellcode

    1. Private Class11 As New Class1
    2. Private Sub colorladen()
    3. Dim allColors() As KnownColor = CType([Enum].GetValues(GetType(KnownColor)), KnownColor())
    4. ComboBox1.DataSource = [Enum].GetValues(GetType(KnownColor))
    5. 'For Each c As KnownColor In allColors
    6. ' Class11.Items.Add(c.ToString)
    7. 'Next
    8. End Sub

    Zeigt er zwar namen an nur nicht die Farben wie beim ersten post vom vb-checker

    mfg Andrejd
    Bilder
    • Bild.jpg

      17,51 kB, 309×163, 65 mal angesehen
    Nimm einfach das Private With Events... raus. Wenn du den Designer benutzt, kannst du das Control nicht noch per Code erstellen. Sonst fügst du die Items noch zur falschen Combobox hinzu...
    Mein Code von ganz am Anfang ist einfacher Copy & Paste. Benutz den einfach :|

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Class12

    edit:
    okay
    jetzt Funkts ;)

    VB.NET-Quellcode

    1. Private Class11 As New Class1
    2. Private Sub colorladen()
    3. Dim allColors() As KnownColor = CType([Enum].GetValues(GetType(KnownColor)), KnownColor())
    4. For Each c As KnownColor In allColors
    5. Class12.Items.Add(c.ToString)
    6. Next
    7. End Sub

    wäre net mit einer kleinen hilfe ob man festlegen kann das wenn Frabe yxx auch die Farbe z.b. von einer Form yxx wird
    dafür war es ja gedacht ;)

    mit

    VB.NET-Quellcode

    1. Private Sub Class12_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Class12.SelectedIndexChanged
    2. End Sub

    oder ?

    VB.NET-Quellcode

    1. Private Sub Class12_SelectedValueChanged(sender As Object, e As EventArgs) Handles Class12.SelectedValueChanged
    2. End Sub

    was wäre da besser ?
    mfg Andrejd

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Andrejd1987“ ()

    Andrejd1987 schrieb:

    Class12

    VB.NET-Quellcode

    1. Private Class11 As New Class1
    Hast Du ggf. 2 Instanzen davon erstellt und verwendest nun die falsche?
    Schmeiß diese Zeile raus, wenn sie nicht in der FormX.Designer.vb steht und benenne alle anderen Instanzen entsprechend um.
    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!
    siehe letzter Post
    ich möchte halt nicht für jede farbe einzeln bestimmen wie hier ;)

    VB.NET-Quellcode

    1. Private Sub Class12_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Class12.SelectedIndexChanged
    2. If Class12.SelectedIndex = 0 Then
    3. Form1.BackColor = SystemColors.ActiveBorder
    4. Me.BackColor = SystemColors.ActiveBorder
    5. End If
    6. End Sub


    mfg Andrejd
    Nice

    VB.NET-Quellcode

    1. Private Sub Class12_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Class12.SelectedIndexChanged
    2. Form1.BackColor = Color.FromName(Class12.SelectedItem.ToString)
    3. Me.BackColor = Color.FromName(Class12.SelectedItem.ToString)
    4. End Sub

    So Funktioniert es :)

    Also recht Herzlichen Dank an alle die mitgeholfen haben ;)

    mfg Andrejd
    Rund wirds, wenn der obige Code in den Konstruktor von Class1 gepackt wird:

    VB.NET-Quellcode

    1. Public Sub New()
    2. Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
    3. Me.DoubleBuffered = True
    4. Me.Items.AddRange(CType([Enum].GetValues(GetType(KnownColor)), KnownColor()).OfType(Of KnownColor)().Select(Function(o) o.ToString()).ToArray())
    5. End Sub
    Hi
    schöner geht das folgendermaßen:

    VB.NET-Quellcode

    1. Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim tc As New ColorConverter()
    3. Dim list As List(Of Color) = tc.GetStandardValues(Nothing).Cast(Of Color)().Where(Function(c) Not c.IsSystemColor).ToList() 'Standardfarben ohne Systemfarben ermitteln
    4. list.Sort(AddressOf CompareColors) 'Sortieren (siehe unten)
    5. _colorBox.DataSource = list 'Datenquelle setzen
    6. _colorBox.DisplayMember = "Name" 'Name der Farbe anzeigen
    7. End Sub
    8. Private Shared Function CompareColors(ByVal left As Color, ByVal right As Color) As Integer
    9. Dim cmp As Integer = left.GetHue().CompareTo(right.GetHue()) 'erst Farbton vergleichen
    10. If cmp = 0 Then cmp = left.GetBrightness().CompareTo(right.GetBrightness()) 'Helligkeit vergleichen, wenn Farbton gleich ist
    11. If cmp = 0 Then cmp = left.GetSaturation().CompareTo(right.GetSaturation()) 'Saettigung vergleichen, wenn Helligkeit und Farbton gleich sind
    12. Return cmp
    13. End Function
    14. Private Sub _colorBox_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles _colorBox.DrawItem
    15. e.DrawBackground()
    16. Static imagePadding As New Padding(1) 'Rahmen fuer das Vorschaubild
    17. Dim listbox As ListBox = _colorBox 'analog fuer ComboBox
    18. Dim color As Color = DirectCast(listbox.Items(e.Index), Color)
    19. 'Bounds fuer Bild und Text ermitteln
    20. Dim imageBounds As New Rectangle(e.Bounds.Left + imagePadding.Left, e.Bounds.Top + imagePadding.Top, 18, e.Bounds.Height - imagePadding.Vertical)
    21. Dim textBounds As New Rectangle(imageBounds.Right + imagePadding.Right, e.Bounds.Top, e.Bounds.Width - (imageBounds.Right + imagePadding.Right), e.Bounds.Height)
    22. 'Vorschaubild zeichnen
    23. e.Graphics.FillRectangle(New SolidBrush(color), imageBounds)
    24. 'Rahmen zeichnen
    25. e.Graphics.DrawRectangle(Pens.DimGray, New Rectangle(imageBounds.Left, imageBounds.Top, imageBounds.Width - 1, imageBounds.Height - 1))
    26. 'Text zeichnen
    27. TextRenderer.DrawText(e.Graphics, listbox.GetItemText(color), e.Font, textBounds, e.ForeColor, TextFormatFlags.NoPrefix Or TextFormatFlags.VerticalCenter)
    28. 'ggf. Fokusrechteck zeichnen
    29. If (e.State And (DrawItemState.NoFocusRect Or DrawItemState.Focus)) = DrawItemState.Focus Then e.DrawFocusRectangle()
    30. End Sub
    31. Private Sub _colorBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _colorBox.SelectedIndexChanged
    32. 'Ausgewaehlte Farbe ermitteln
    33. _colorLabel.BackColor = DirectCast(_colorBox.SelectedValue, Color)
    34. End Sub


    Color sind die eigentlich bearbeiteten Daten. Da man prinzipiell an Daten bindet, sollte man entsprechend auch die Daten verwenden und über DisplayMember anzeigen.

    Gruß
    ~blaze~

    Andrejd1987 schrieb:

    VB.NET-Quellcode

    1. Form1.BackColor = Color.FromName(Class12.SelectedItem.ToString)
    Was isn das fürn Ranz?
    Gugge mal Post #11, da stand was über Instanzen von Dialogen.
    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!
    Den "Ranz" hat er von mir. Was haben Dialoge damit zu tun, wenn er eine Combobox haben will? Oder was meinst du ?(
    Wenn 's darum geht, dass diese Zeile eigentlich sinnbefreit ist, weil er darüber ja schon die mit dem Me hat, dann ok ^^

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    vb-checker schrieb:

    Was haben Dialoge damit zu tun
    Auch Dialoge wollen über eine ordentlich mit New erstellte Instanz angesprochen werden.
    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!