ComboBox Dropdownwidth

  • VB.NET
  • .NET (FX) 4.0

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    ComboBox Dropdownwidth

    Hallo Leute,

    kleine Frage am Rande..

    Kann man etwas tricksen um die Breite des Dropdowns einer ComboBox automatisch anzupassen?
    Da ich die ComboBox durch ein SQL Statement fülle kann die Breite ziemlich variieren.
    Ich denke es gibt kein Weg drumherum eine Funktion zu schreiben die mir das längste Element zurück gibt (.length) und dann diesen mit einem Wert "X" mal zu nehmen.

    Grüße,
    Drahuverar
    Option Strict On!
    @us4711
    Danke-
    Dieses Beispiel habe ich mir schon angesehen. Wenn ich mir eine WinForm mache und den Code nehme und die ComboBox Initialisiere (Form Load) passiert gar nix. Ich hab lediglich die Elemente drin, aber auch nichts in der DropDownList. ^^

    ...na ja ^^
    Muss wohl selbst was basteln.
    Option Strict On!
    Es ist was in der Liste drin. Geh mal mit den Pfeiltasten durch.
    Der Code zeichnet das AUSGEWÄHLTE!!!! Item! Nicht alle.
    Code lesen, verstehen, ggf. nachfragen... dann sagen er passt nicht!
    Nicht umgekehrt.

    EDIT:
    Oder hast du gar vorher ne Combobox1 gehabt, den Code eingefügt, die Box gelöscht und somit auch gleich alle Handles Klauseln? ;D



    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    Definiere

    Drahuverar schrieb:

    Breite des Dropdowns
    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!
    @MemoAnMichSelbst
    Ist ja wirklich kein riesen Code, dass man den nicht verstehen könnte. Jedenfalls geschieht bei mir nix, bis auf das ich die 3 Elemente drin habe und sonst sich nichts verändert.

    EDIT: Oh..nein.. Das kann sein... Ich hab eine "TestForm" die ich immer für solche Sachen missbrauche.. Jetzt kann es sein das noch etwas im Designer rumirrt.. 8|

    @RodFromGermany
    Nun, momentan fehlt die Hälfte des Textes -> "Ich bin ein ziemlich langer Text" wird als "Ich bin ein zie" angezeigt. Manchmal reicht die Breite des Controls. Manchmal eben nicht.. Deswegen dachte ich mir, ich lauf alles durch und dem entsprechend erstelle ich die DropDownWidth...
    Option Strict On!
    Hast du die Handles gelöscht? ;D

    Textlängen kannst mit:

    VB.NET-Quellcode

    1. Dim graph = Me.CreateGraphics
    2. graph.PageUnit = Drawing.GraphicsUnit.Pixel
    3. Dim size = graph.MeasureString("Dies ist ein Test-Text um zu gucken wie lang er denne wird.", Me.Font)​

    ermitteln.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Drahuverar schrieb:

    dem entsprechend
    Ist auf Deiner GUI entsprechend Platz dafür?
    Wenn nein, geht es sowieso nicht,
    wenn ja, mach die CB gleich maximal breit.
    es sieht blöd aus, wenn sich bei D&D & Co die Breite eines Controls ändert.
    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!
    @MemoAnMichSelbst
    Ja, und siehe da, schon funktioniert das Beispiel von MSDN :saint:

    MemoAnMichSelbst schrieb:

    MeasureString


    Misst dann wirklich die länge des Strings, nicht die der Font. Oder nimmt GraphicsUnit.Pixel die Font als Info?


    @RodFromGermany
    Ich wollte vermeiden die Controls ewig lang zu machen, bin sowieso, was das Designen angeht, etwas anspruchslos.
    In der Regel sollte man nicht viel suchen müssen und durch die Autovervollständigung direkt an das Element, welches man braucht, kommen. (Aber wenn man mal die DropDownList nutzt, sollte die halt "so Breit wie"-sein)
    Kann ja irgendwann mal sein, dass in der Datenbank ein noch längerer Text/String hinterlegt ist.. dann passt es ja wieder nicht.
    Option Strict On!
    Du gibst in dem Beispiel doch extra mit Me.Font mit welche Font es ist und anhand derer in Kombination mit dem Text bekommst du höhe und breite ermittelt.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Drahuverar schrieb:

    wirklich
    Zum Messen brauchst Du den Font und den String im aktuellen Graphics-Kontext.
    Das Ergebnis kommt in der gewählten Einheit raus.
    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!
    Macht's vielleicht Sinn, den Graphic-Kontext der ComboBox selbst zu nehmen?

    VB.NET-Quellcode

    1. Private Sub InitializeComboBox()
    2. animals = New String() {"Elephant", "c r o c o d i l e", "lion", "Das ist ein ganz langer Text für das Dropdownelement der Combobox"}
    3. ComboBox1.DataSource = animals
    4. Dim MaxWidth As Single = 0
    5. Using g As Graphics = Me.ComboBox1.CreateGraphics
    6. For Each an As String In animals
    7. MaxWidth = Math.Max(MaxWidth, g.MeasureString(an, Me.ComboBox1.Font).Width)
    8. Next
    9. Me.ComboBox1.DropDownWidth = CInt(MaxWidth)
    10. End Using
    11. End Sub

    Dabei kann man getrost eine ComboBox auf das Form zeihen, und den OwnerDrawModus vergessen, da sich die Frage des TE ja auf die DropDownWidth bezog.

    Drahuverar schrieb:

    anspruchslos
    Jou, die DropDown-Breite ist unabhängig von der Anordnung der Controls auf der Form, allerdings von der Position der Fenster auf dem Screen, wenn die ComboBox rechtsbündig am Screen liegt, werden die Items defaultmäßig ins Nirvana geschrieben.

    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!
    @RodFromGermany
    Ach.. mensch.. Ich verstehe.. Wusste ich nicht.
    Wenn z.B. die Liste ewig lange ist und das Control sozusagen "zu weit unten" wäre, wird die Liste nämlich nach oben projiziert.. Schade, dass dieses Verhalten eintritt sobald es zu weit rechts ist.
    Option Strict On!

    Drahuverar schrieb:

    zu weit rechts
    Wenn Du das mit OwnerDrawing machst, sollte es alles schön werden können.
    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!