ComboBox Bestimmten Bereich beim Aufklappen anzeigen

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    ComboBox Bestimmten Bereich beim Aufklappen anzeigen

    Hallo,

    ist es möglich bei der ComboBox möglich, das beim Aufklappen der Scrollbalken "mittig" steht?

    Hintergrund: Es gibt wesentlich mehr Einträge wie angezeigt werden (z.b. MaxDropdownItems = 30, Item.count=300)
    Ich möchte erreichen, dass nicht immer von "oben" nach "unten" gescrollt werden muß.

    Angenommen, es handelt sich um eine Namensliste, und es gibt pro Buchstäbe etwa gleich viele Einträge,
    dann sollte das Menü beim Aufklappen etwa bei "K" bis "P" stehen.
    Es soll aber nicht mit ListIndex=irgendetwas vorselektiert werden. Nur der Wertebereich sollte zentriert dargestellt sein.

    Kann mir jemand helfen? Vielen Dank!
    Hallo,

    niemand eine Idee oder habe ich mich zu kompliziert ausgedrückt?

    Beim Klick auf eine Combobox wird die festgelegte Anzahl Einträge angezeigt.
    Die Anzahl der vorhandenen Einträge ist aber weitaus größer.
    Ich möchte, dass die ComboBox standdardmäßig den Bereich der Einträge "mittig" anzeigt, nicht die ersten paar Einträge.

    In VBA etwa ist das ganz einfach - und das sollte doch auch in VBgehen - oder etwa nicht?
    Da du scheinbar mit Index nicht ran willst (?) könnte ich da nur empfehlen (bei 300 Einträgen..) eine Sortierung einzubauen, dass der User sowas wie ne Suchmaske hat a la TextBox.

    Ich stelle mir das als User auch grauenhaft vor aus einer ComboBox 300 Einträge durchzuschauen und mich tot zu scrollen.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Vielen Dank für die Antwort!

    Wenn ich den Index setze, habe ich den Eintrag auch gleich "vorne", d.h. er ist in der NICHT aufgeklappten ComboBox sichtbar, also gesetzt.
    Der initiale Zustand soll aber eine "leere" Auswahl sein (SelectedIndex=-1).
    Der Anwender soll dann aber max. Komfort haben, also kürzeste Wege beim Scrollen, wenn die Box aufgeklappt wird.
    Hallo,

    ich möchte das Thema noch mal aufgreifen - vielleicht habe ich meine Frage zu kompliziert gestellt gehabt.

    Stellt Euch eine ComboBox vor, die Einträge sind das Alphabet von A-Z.
    Die ComboBox istbeim Aufklappen auf 10 Einträge begrenzt.

    Standardmäßig würde ich nun beim Aufklappen der ComboBox "A - J" angezeigt bekommen, der Scrollbalken ist oben.

    Wie bekomme ich es hin, das aber der Scrollbalken mittig steht, und der Wertebereich dann etwa I-Q liegt???

    Ich möchte keine Vorauswahl über SelectedItem vorher treffen, der Zustand der Box soll "Leer" sein.

    Gibt es dafür wirklich keine Lösung?
    Nein, so stelle ich mir es nicht vor.

    Ich möchte dem Anwender möglichst viel Komfort bieten, möglichst wenig scrollen zu müssen.

    In anderen Anwendungen ist es mir schon oft unter gekommen, dass der
    angezeigte (sichtbare) Bereich einer Auswahlliste mittig war.

    Hat einfach den Vorteil, dass man in beide Richtungen scrollen kann und dabei kurze "Wege" überwinden muss.

    Das sollte doch auch in VB realisierbar sein. Auch ohne eine Vorauswahl extra zu treffen. Außerdem was mache ich, wenn die Anzahl der Items die über MaxDropDownItems festgelegte Anzahl übersteigt? Dann muss ja wieder von oben nach unten gescrollt werden!

    Niemand eine Idee?
    Bilder
    • 1.jpg

      12,05 kB, 300×300, 228 mal angesehen
    • Standardverhalten.jpg

      23,97 kB, 303×602, 186 mal angesehen
    • gewünschte Anzeige.jpg

      24,12 kB, 301×589, 247 mal angesehen

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

    Ich möchte dem Anwender möglichst viel Komfort bieten, möglichst wenig scrollen zu müssen.
    Schaue dir einmal folgende Eigenschaften AutoCompleteCustomSource, AutoCompleteMode und AutoCompleteSource an...
    Vielleicht ist da etwas dabei, dass den Auswahlkomfort vieler Coboboxeinträge erhöhen kann...

    orchov schrieb:

    Es soll aber nicht mit ListIndex=irgendetwas vorselektiert werden. Nur der Wertebereich sollte zentriert dargestellt sein.


    anders geht aber nicht

    im dropdown event stellst du die gewünschte Index ein und fertig

    o. du nimmst als Index count/2, wenn du es ungefähr mittig haben möchtest, etc

    orchov schrieb:

    Der initiale Zustand soll aber eine "leere" Auswahl sein (SelectedIndex=-1).


    Und was ist der Unterschied, wenn ein Eintrag schon ausgewählt ist o. nicht?? Das combobox zeigt sowieso das mittlere Range an.

    EDIT: ich habe hier eine Lösung gefunden (gegoogelt):

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Public Enum ComboBoxButtonState As Int32
    4. STATE_SYSTEM_NONE = 0
    5. STATE_SYSTEM_INVISIBLE = &H8000
    6. STATE_SYSTEM_PRESSED = &H8
    7. End Enum
    8. <StructLayout(LayoutKind.Sequential)> _
    9. Public Structure RECT
    10. Public Left, Top, Right, Bottom As Int32
    11. End Structure
    12. <StructLayout(LayoutKind.Sequential)> _
    13. Public Structure COMBOBOXINFO
    14. Public cbSize As Int32
    15. Public rcItem As RECT
    16. Public rcButton As RECT
    17. Public buttonState As ComboBoxButtonState
    18. Public hwndCombo As IntPtr
    19. Public hwndEdit As IntPtr
    20. Public hwndList As IntPtr
    21. End Structure
    22. <DllImport("user32.dll")> _
    23. Public Shared Function GetComboBoxInfo(ByVal hWnd As IntPtr, ByRef pcbi As COMBOBOXINFO) As Boolean
    24. End Function
    25. <DllImport("user32.dll")> _
    26. Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
    27. End Function
    28. Private Const WM_HSCROLL As Int32 = &H114
    29. Private Const WM_VSCROLL As Int32 = &H115
    30. Private Enum ScrollType As Int32
    31. SB_LINEUP = 0
    32. SB_LINEDOWN = 1
    33. SB_TOP = 6
    34. SB_BOTTOM = 7
    35. End Enum
    36. Private Sub ComboBox1_DropDown(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.DropDown
    37. Timer1.Start()
    38. End Sub
    39. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    40. Timer1.Stop()
    41. Dim cbi As New COMBOBOXINFO
    42. cbi.cbSize = Marshal.SizeOf(cbi)
    43. If GetComboBoxInfo(ComboBox1.Handle, cbi) Then
    44. For i = 0 To (ComboBox1.Items.Count - 1) / 2
    45. SendMessage(cbi.hwndList, WM_VSCROLL, ScrollType.SB_LINEDOWN, 0)
    46. Next
    47. End If
    48. End Sub
    49. End Class


    Stelle den Invervall für timer z. B. auf 100 ms.

    Probiere mal aus, es gibt einen einzigen Schönheitsfehler, den man entweder in Kauf nimmt, o. es gibt sicherlich auch eine Möglichkeit, diesen zu beheben. Aber hier steige ich aus.

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

    imo gehts nicht, wie TE wünscht:
    Einserseits soll im eingeklappten Zustand nichts selektiert sein, aber im aufgeklappten Zustand soll die Mitte selektiert sein.

    Combobox ist numal so, dasses beim Aufklappen das Item selektiert, was auch vorher selektiert war.
    Theoretisch könnte man nu beim Aufklappen das mittlere Item selektieren, aber das wäre ein Eingriff in die Logik, denn normal verändert sich durch Aufklappen allein noch nicht die Selektion.
    nimm mal die Mühe und probiere es aus

    wenn man auf das dropdown button klickt, wird das combobox etwa in die Mitte gescrollt und dabei wird nichts selektiert

    das wollte doch der TE, nicht?!? (siehe auch Bild)
    Bilder
    • image.png

      14,26 kB, 416×486, 238 mal angesehen
    Hallo vb_fan,

    vielen Dank für Deinen Beitrag.
    Werde es gleich ausprobieren und mich dann noch mal melden- aber dies sieht schon vielversprechend aus.

    Also nochmals vielen Dank an Dich und ALLE, die sich in das Thema rein gedacht haben.

    EDIT:
    Funktioniert. Super! :thumbsup:

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