ComboBox Farb auswahl

  • VB.NET

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

    Meinst du evtl mit .Net Framework 4.5? Das ist das neueste. Mit VIsual Studio haben doch die Steuerelemente nichts zu tun. So weit ich weiß, gibt es so eine Combobox nicht. Ist aber doch nicht schwer zu erstellen!?

    edit: Hab schnell was gebastelt:

    VB.NET-Quellcode

    1. Public Class Class1
    2. Inherits ComboBox
    3. Public Sub New()
    4. Me.DrawMode = Windows.Forms.DrawMode.OwnerDrawFixed
    5. Me.DoubleBuffered = True
    6. End Sub
    7. Private Sub Class1_DrawItem(sender As Object, e As System.Windows.Forms.DrawItemEventArgs) Handles Me.DrawItem
    8. If e.Index >= 0 Then
    9. Dim c As Color = Color.FromName(Me.Items(e.Index).ToString)
    10. e.Graphics.FillRectangle(Brushes.White, e.Bounds)
    11. e.Graphics.FillRectangle(New SolidBrush(c), New Rectangle(e.Bounds.X + 3, e.Bounds.Y + 3, 17, 10))
    12. e.Graphics.DrawString(Me.Items(e.Index).ToString, Me.Font, New SolidBrush(Me.ForeColor), New Point(23, e.Bounds.Y + 2))
    13. End If
    14. End Sub
    15. End Class


    Befüllen kannst du die zum Beispiel so:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. Dim allColors() As KnownColor = CType([Enum].GetValues(GetType(KnownColor)), KnownColor())
    3. For Each c As KnownColor In allColors
    4. Class11.Items.Add(c.ToString)
    5. Next
    6. End Sub


    Sieht dann so aus:
    Bilder
    • unbenannt.png

      31,04 kB, 479×583, 359 mal angesehen

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „vb-checker“ ()

    @Andrejd1987: Oder meinst Du so was:

    VB.NET-Quellcode

    1. Dim col As Color
    2. Using dlg As New ColorDialog
    3. If dlg.ShowDialog <> Windows.Forms.DialogResult.OK Then
    4. Return
    5. End If
    6. col = dlg.Color
    7. End Using
    8. MessageBox.Show(col.ToString)
    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!

    xtts02 schrieb:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim knownColors = [Enum].GetNames(GetType(Drawing.KnownColor))
    3. Me.ComboBox1.DataSource = knownColors
    4. End Sub
    Das bewirkt nur das die namen die der Combobox stehen aber leider ohne die dazugehörige Farbe


    vb-checker

    der meckert wegen Opjektverweis rum (ich hatte eigene klassen ja nie erstellt ;)), deswegen weis ich nicht was damit gemeint ist bzw. Google spuckt auch nur nutzlose sachen aus ;)

    mfg Andrejd

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

    @xtts02

    ja das Control vom @vb-checker habe ich natürlich mit benutzt ;)
    bei dir zeigt er ja nur die namen ohne Farbe an und bei dir meckert der code wenigstens nicht aber beim @vb-checker wie oben geschrieben meckert er ja wegen Objektverweis

    mfg Andrejd

    Andrejd1987 schrieb:

    bei dir zeigt er ja nur die namen ohne Farbe

    Ein Standard-ComboBox kann keine unterschiede Farbe für einzelne Items darstellen. Es gibt immer nur eine Hintergrundfarbe für alle Items.
    Wenn man es anders haben will. muss man das Zeichnen der Items selbst übernehmen. Das hat vb-checker schön in eine eingene Klasse ausgelagert (Class1). Seinen Code musst Du zuerst kompilieren. Das daraus erstellte Control ziehst Du auf deine Form. In Form-Load Event kannst Du die Liste der Farben zuweisen.

    Andrejd1987 schrieb:

    wie oben geschrieben meckert er ja wegen Objektverweis
    Welche Code-Zeile?
    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!

    Andrejd1987 schrieb:

    Class1
    ist eben eine Klasse und keine mit New erstellte Instanz.
    Gugst Du hier.
    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!
    Rod hat es ja eigentlich schon erklärt. In meinem Code spreche ich die Instanz der Combobox mit "Class11" an. Diesen Namen hat das Control automatisch bekommen, da es ja vom Typ "Class1" ist. Ich bin mir bewusst, dass das eine ziemlich dämliche Benennung ist. Ich habe halt schnell eine Klasse erstellt und nicht auf den Namen geachtet. Du könntest du Klasse natürlich in etwas wie "ColoredComboBox" umbenennen. Dann würde dein Control "ColoredComboBox1" heißen. ;)

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    VB.NET-Quellcode

    1. Private WithEvents Class11 As 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. Class11 = New Class1
    6. Class11.Items.Add(c.ToString)
    7. Next
    8. End Sub

    ich kann da jetzt auch nur rumprobieren weil der thread nicht wirklich viel infos bietet.

    mfg Andrejd
    Das ist grundsätzlich nicht falsch, bis auf die Zeile Class11 = New Class1. Das muss man nur einmal machen und vor allem nicht in einer Schleife, sondern davor. Aber die Erstellung des Controls per Code kannst du dir sparen. Wenn die Klasse einmal kompiliert wurde, erscheint das Control in Visual Studio im Steuerelemente-Fenster. Von dort ziehst du es einfach auf die Form.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    VB.NET-Quellcode

    1. Private WithEvents Class11 As 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. Class11.Items.Add(c.ToString)
    6. Next
    7. End Sub

    oder doch eher?

    VB.NET-Quellcode

    1. Private WithEvents Class11 As New Class1

    das Control zeigt aber leider nix an
    mfg Andrejd
    Wenn du das Control unbedingt per Code erstellen willst, brauchst du schon das New zur Instanziierung und danach den restlichen Code zum Befüllen. Aber mache es doch einfach mit dem Designer, in dem du das Control auf die Form ziehst, das ist doch viel einfacher und idiotensicher.
    Bilder
    • unbenannt.png

      38,3 kB, 800×600, 313 mal angesehen

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Andrejd1987 schrieb:

    VB.NET-Quellcode

    1. Class1
    Wovon ist diese Klasse abgeleitet?
    Wenn von einem GUI-Element:
    Siehst Du im Designer oben ein zahnradähnliches Icon mit diesem Namen?
    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!
    Der Code zum Hinzufügen der Farben kann auch kürzer gemacht werden:

    VB.NET-Quellcode

    1. Dim allColors() As KnownColor = CType([Enum].GetValues(GetType(KnownColor)), KnownColor())
    2. Class11.Items.AddRange(allColors.OfType(Of KnownColor)().Select(Function(o) o.ToString()).ToArray())