Combobox spezielles verhalten erwünscht.
-
Ich möchte bei einer Combobox ein spezielles verhalten erzwingen. Diese verhalten wären:
1.) Es muss ein Text vorgegeben werden, sowas wie : "Bitte Zahl auswählen"
2.) Der Nutzer muss nun aus der Combobox etwas auswählen (Er darf also nichts selber eingeben bzw darf die Eingabe nur mit irgendetwas aus der Kombobox übereinstimmen)
3.) Macht der nutzer nur die Combobox auf und wieder zu (er wählt also nichts konkretes aus) muss immer noch "Bitte Zahl auswählen" dastehen.
4.) Hat der Nutzer einmal etwas gültiges aus der Box gewählt kommt er nicht mehr in den "urzustand" zurück (Dieses verhalten ist gewollt).Ich weiss nur nicht wie ich das verhalten hinkriegen soll.
Verwende ich als Style "DropDownList" kann ich den urzustand mit "Bitte Zahl auswählen" nicht herstellen. Bei "DropDown" darf der Nutzer eigene Sachen eingeben. Gibt es noch andere Flags die ich verwenden könnte?Eine alternative wäre, wirklich DropDownList zu wählen und den urzustand als eintrag in die Liste zu nehmen. Doch dann müsste ich beim öffnen der Liste diesen Urzustand rausnehmen und ggf beim Schließen wieder rein (sofern der nutzer keinen anderen Eintrag gewählt hat). Irgendwie kommt mit das alles zu kompliziert für so eine einfache Aufgabe vor. Müsste doch auch irgendwie einfacher gehen.
-
Hallo,
also einfacher als den von dir beschriebenen letzten Vorschlag sehe ich auch keinen (außer von ComboBox zu erben und diverse Messages abzufangen).
Die Ereignisse 'SelectedIndexChanged', 'DropDown' und 'DropDownClosed' müßten dann ausreichen (und falls du dies öfters brauchst, kannst du ja auch einfach eine eigene ComboBox erstellen, dann aber die On...-Methoden anstatt der Ereignisse überschreiben).
P.S. Du redest von WinForms, oder doch WPF?
-
Mit WinForms geht das ganz einfach:
1. Nimm als StyleDropDown
.
2. Schreib insText
-Property "Bitte Zahl auswählen".
3. Füge einenValidating
Eventhandler dazu.
4. Im Eventhandler prüfst duSelectedIndex
auf -1. Falls -1 gesetzt ist, prüfst du noch dasText
-Property auf einen gültigen Wert. Falls dort ebenfalls kein gültiger Wert ist, setzt du dasText
-Property zurück auf "Bitte Zahl auswählen". Ansonsten deaktivierst du das Control.Vorteil den ich hier noch sehe, die ComboBox wird wirklich erst beim Verlust des Focus oder durch das Drücken von Enter deaktiviert und die Eingabe wird übernommen. Dadurch kann der User seine Wahl trotzdem noch verändern. Falls du dies nicht willst, hörst du halt noch auf das
SelectedIndexChanged
-Event und falls der Wert nicht -1 ist, deaktivierst du das Control. Durch das deaktivieren wird übrigens auch ein Validating-Event ausgelöst. Du kannst also die Reaktion auf die ausgewählte Zahl dort hinzufügen oder gleich im nachfolgenden Validated-Event.Eine andere möglichkeit mit
DropDownList
wäre im übrigen, dass du eben als erstes Element "Bitte Zahl auswählen" einfügst und dann beiSelectedIndexChanged
den Index 1 als ungültig ansiehst. Simpel einfachGrüssli
-
Ja ich rede von Winforms, eigentlich sogar noch eine Spur schlimmer, die ComboBox ist eine eigenerstellung (Nicht von mir). Prinzipiell erbt die sogar von der Winforms Combobox. Leider hat diese die gewünschten Features auch nicht. Daher hab ich nach WinForms gefragt. Naja ggf muss ich mir da doch was zusammen Stricken. Besten Dank dennoch.
-
@Dravere das klingt doch supi. Muss ich gleich morgen mal ausprobieren.
-
Das ganze klappt nun schon hervorragend. Besten Dank bis hierher. Noch eine kleine Sache hätte ich gerne. Aber die fällt eher in die Kategorie Featurewünsche. Wenn ich das noch hinkriege wäre das aber ziemlich nett.
Aktuell wird mir keine Eingabe vorgeschlagen obwohl ich mitm_ComboBox.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; m_ComboBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
arbeite.
Das Problem liegt wohl am DropDown mode, hier hätte ich gerne das List verhalten. D.H.: Wenn ich etwas eingebe was nur 1 Eintrag aus der Liste entsprechen kann, wird dieser Eintrag schon vorselektiert und brauch nur noch bestätigt zu werden. KAnn ich das verhalten irgendwie erzwingen?
P.S.: Habs lösen können, hab dafür am TextUpdate event folgende Funktion gehängt:
void ComboBoxTextUpdate(object sender, EventArgs e) { int oldSelection = m_ComboBox.Text.Length; //check if we have an item wich is equal to the text int value = m_ComboBox.FindString(m_ComboBox.Text); // this check must be made, so we doen't select the item 2 times if (value != -1 && m_ComboBox.Items[value].ToString() != m_ComboBox.Text) { //select this item m_ComboBox.SelectedIndex = value; m_ComboBox.Select(oldSelection, m_ComboBox.Text.Length); } }