Aussehen von ComboBox anpassrn (DropdownList > Dropdown)

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Cyver.

    Aussehen von ComboBox anpassrn (DropdownList > Dropdown)

    Hallo Leute,

    ich bin dabei ein Programm zu machen, welches das Steuerelement ComboBox in unterschiedlichen varianten beinhaltet, da es leider keine "ReadOnly" funktion bei der ComboBox gibt. Jede ComboBox wo nur gelesen werden darf ist vom Typ DropdownList, die anderen sind ganz normal vom Typ Dropdown. Leider bin ich aber mit der Optik unzufrieden. Meine Frage ist jetzt, wie kann ich die ComboBox(DropdownList) bearbeiten, dass es die Funktion von DropdownList behält jedoch das Aussehen von Dropdown bekommt?

    Kann mir da jemand Helfen?

    Danke im voraus

    Mit freundlichen Grüßen
    Cyver
    Also ich will das bei den comboboxen wo viele Einträge sind die Suche leichter gemacht wird indem ich dem User die Möglichkeit gebe zu einem ganz normal per Auswahl zum anderen per Autocomplete die Daten schneller finden zu können und damit nicht alles anders aussieht würde ich gern das aussehen anpassen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Cyver“ () aus folgendem Grund: Zusatz Info

    sonne75 schrieb:

    Was ist mit deinen Satzzeichen passiert? Tastatur kaputt?


    Sorry der Beitrag wurde vom Handy aus geschrieben.

    Also die Combobox bietet bei dem Typ Dropdown die Funktion "Autocomplete" an. Wenn ich z. B. nach den Namen Anna in meiner Combobox mit 100 Einträgen suchen würde, wäre es einfache den Namen zu schreiben statt im Dropdown zu suchen. Zudem füllt er den Text automatisch aus z. B. wenn in der Liste Anna, Anika, Andy und so sind würde nachdem ich Ann geschrieben habe schon der Richtigen Namen angeben werden. Klar bei den Kurzen Namen macht es wenig Sinn, jedoch bei etwas längeren Sachen nimmt es schon arbeit ab. Desshalb brauche ich diese und die wo nur die Auswahl möglich sein soll, sollen so aussehen wie die Comboboxen mit dem Typ DropdownList
    Damit ist gemeint, bei den Comboboxen vom Typ DropdownList gibt es nicht die Möglichkeit eine Eingabe zu tätigen, jedoch bei dem Typ Dropdown weshalb auch das mit Autocomplete funktioniert.Klar ich könnte die anderen Comboboxen auch auf den Typ DropboxList ändern damit würde es ja wieder einheitlich aussehen aber da möchte ich nicht das die Leute was in die Felder schreiben können sondern wirklich NUR auswählen. Und da wäre so eine Art "ReadOnly" von Vorteil, weil es ja die Eingabe blockt. Und darum kam ich auf die Idee einfach das Aussehen zu ändern, wenn möglich. Sollte es etwas anderes geben bin ich natürlich auch dafür offen nur ist dies meine erste Idee gewesen :whistling:
    Ach so, dir geht es gar nicht um ReadOnly (dass keine Auswahl möglich ist), sondern nur, dass die Einträge nicht geändert werden können.
    Dann mach es doch manuell im Event, wenn der Eintrag geändert wird: setze ihn mit Gewalt wieder auf den alten Wert.

    sonne75 schrieb:

    Ach so, dir geht es gar nicht um ReadOnly (dass keine Auswahl möglich ist), sondern nur, dass die Einträge nicht geändert werden können.
    Dann mach es doch manuell im Event, wenn der Eintrag geändert wird: setze ihn mit Gewalt wieder auf den alten Wert.

    Und das geht wie? Also vielleicht nochmal zum Verständnis... wenn ich eine Combobox habe mit z.B. "Ja" und "Nein"... Standardmäßig ist nichts ausgewählt und möchte das er eins von beiden auswählt statt "vielleicht" einzutragen bzw. damit er halt wie bei dem Typ Dropdown nur auswählen kann ohne dass die unterschiedlich aussehen
    So, musste selbst ein bisschen rumspielen, so einfach, wie ich dachte, war es nicht, aber jetzt geht es.

    Du brauchst eine List mit deinen Einträgen und den letzten Eintrag:

    VB.NET-Quellcode

    1. Dim lst As New List(Of String) From {"eins", "zwei", "drei"}
    2. Dim last As String = ""


    Dann im Form_Load:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    2. IndexComboBox.DataSource = lst
    3. IndexComboBox.SelectedIndex = 0
    4. last = IndexComboBox.Text
    5. End Sub


    Und zwei Events:

    VB.NET-Quellcode

    1. Private Sub IndexComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles IndexComboBox.SelectedIndexChanged
    2. last = IndexComboBox.Text
    3. End Sub
    4. Private Sub IndexComboBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles IndexComboBox.TextChanged
    5. If IndexComboBox.Text <> last AndAlso last <> "" Then
    6. IndexComboBox.Text = last
    7. IndexComboBox.SelectedIndex = IndexComboBox.Items.IndexOf(last)
    8. End If
    9. End Sub


    Und wenn du es wirklich OOP-konform machen willst, erstellst du eine ReadOnlyComboBox-Klasse, die von der ComboBox abgeleitet ist und packst den Code von "Load" in "New", bei "New" übergibst du noch die Liste.

    VB.NET-Quellcode

    1. Public Class ReadOnlyComboBox
    2. Inherits ComboBox
    3. Private lst As List(Of String)
    4. Private last As String = ""
    5. Public Sub New(ByVal MyList As List(Of String))
    6. lst=MyList
    7. Me.DataSource = lst
    8. Me.SelectedIndex = 0
    9. last = Me.Text
    10. End Sub


    Und bei den Events ersetzt du auch den Namen durch "Me". Müsste dann gehen.

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

    Leider funktioniert es nicht so wirklich...1) habe ich schon eine db abfrage hinter dem selectindexchange(z. B. Erst muss das Feld Geschlecht ausgewählt werden damit in der nächsten combobox alle Namen eines Geschlechts erscheinen) und 2) zeigt er nie Das an was ich auswähle bei deinem Programm... ich wähle 1 und er gibt 2 oder 3 aber Danke für deine Mühe

    sonne75 schrieb:

    Ich verstehe kein Wort. Ich habe den Code bei mir getestet und es funktioniert einwandfrei.

    Zeig mir dein Code.



    Ich habe dein code einfach kopiert und getestet in einem neuen Projekt mit nur 1ner combobox... wenn ich auf zwei drücke steht da weiterhin die eins drücke ich auf drei steht da zwei drücke ich nochmal auf drei steht da auch 3...somit muss ich es doppelt machen damit er es nimmt? Und den Punkt 1 vergessen wir erstmal weil da habe ich ein denk Fehler und muss den beheben im Programm bzw testen ob es wirklich ein Problem ist
    Stimmt, es kommt daher, dass der SelectedIndex "last" ändert und somit auch "TextChanged" ausgelöst wird.

    Ich schau, wie ich das beheben kann.

    @Cyver
    Hier die Änderung:

    VB.NET-Quellcode

    1. Private Sub IndexComboBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles IndexComboBox.TextChanged
    2. If lst.Contains(IndexComboBox.Text) Then Exit Sub
    3. IndexComboBox.Text = last
    4. IndexComboBox.SelectedIndex = IndexComboBox.Items.IndexOf(last)
    5. End Sub


    Wobei es jetzt möglich ist, erstes Element z.B. wie das dritte zu benennen. Wenn du das auch ausschalten willst, kann man bei der If noch abfragen, ob der Index des Eintrages in der List mit dem .SelectedIndex übereinstimmt...
    Hat sich erledigt, er springt schon beim ersten Buchstaben rein und Index kann man leider nicht prüfen, da er gleich auf -1 geht.
    Die obere Lösung müsste also klappen.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „sonne75“ ()

    Danke es scheint soweit zu funktionieren
    :thumbsup:
    Gibt es denn auch die Möglichkeit den cursor ( | ) zu deaktivieren für einzelne comboboxen?

    Ich sage schon mal vielen vielen lieben Dank Sonne75 dass du dir die Zeit genommen hast um mir zu helfen...bin dir sehr dankbar...

    Ich wünsche dir noch weiterhin einen schönen Tag :thumbsup: :love:

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