Laden...

ComboBox: Benutzer soll Einträge aus DropDown-Liste löschen, ohne dass aktuelle Eingabe verschwindet

Erstellt von SirFoldabit vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.583 Views
S
SirFoldabit Themenstarter:in
66 Beiträge seit 2008
vor 12 Jahren
ComboBox: Benutzer soll Einträge aus DropDown-Liste löschen, ohne dass aktuelle Eingabe verschwindet

Hi Leute,

ich habe eine ComboBox, die der User mit Werten befüllen kann.
Natürlich dürfen diese Werte auch wieder vom User zur Laufzeit gelöscht werden.
Es kann nun z.B. sein, dass der User gerade einen Text eingegeben hat und der Wert aber noch nicht gespeichert wurde, da noch keine Aktion ausgeführt wurde.
Wenn der User jetzt auf den DropDown-Pfeil klickt, wird automatisch der Text in der ComboBox mit selektiert.
Das ist aber sehr unpraktisch, denn wenn der User einen Eintrag in der DropDownListe löschen möchte, dann wird der zuvor eingegebene Text mit gelöscht, da er ja auch selektiert ist.

Ich möchte nun also, dass z.B. beim Klick auf den DropDown-Pfeil sich ganz normal die Liste mit den vorhandenen Einträgen öffnet... aber der Text in der ComboBox nicht automatisch mitselektiert wird.
(Die Einträge der ComboBox werden über das KeyDown-Event gelöscht, wenn "Entf" gedrückt wurde)

Ich habe es wie folgt probiert (Ohne Erfolg):


private void comboBox1_DropDown(object sender, EventArgs e)
{
    comboBox1.SelectionStart = comboBox1.Text.Length;
}

private void comboBox1_Enter(object sender, EventArgs e)
{
    comboBox1.SelectionStart = comboBox1.Text.Length;
}

Bei Textboxen funtkioniert das anscheinend so...bei meiner ComboBox jedenfalls nicht.
Hat jemand ne Idee???

LG SirFoldabit

Gelöschter Account
vor 12 Jahren

Ich kann dein Problem nicht nachvollziehen. Ich habe gerade ein Testprojekt erstellt und eine ComboBox im Designer mit ein paar TestItems gefüllt.
Zur Laufzeit habe ich einen Testwert eingetragen und danach den DropDown gedrückt. Es wurde nichts selektiert. Welche IDE und .NET Version und Windows Version verwendest du?

S
SirFoldabit Themenstarter:in
66 Beiträge seit 2008
vor 12 Jahren

Ich habe gerade auch nochmal kurz ein Testprojekt erstellt um das zu verdeutlichen.
Also, wenn ich etwas eintippe, das noch nicht zur ComboBoxListe hinzugefügt wurde, ist alles OK.
Das Bild zeigt aber, dass der Text in der ComboBox immer mitselektiert wird, wenn sich kein Text in der ComboBox befindet, der noch nicht zur Liste hinzugefügt wurde.
Wenn ich dann in diesem Fall das Item "String1" löschen möchte (durch Drücken von "Entf"), wird der Text "ABCDEF" in der ComboBox automatisch mit entfernt.
Genau das möchte ich aber gerne verhindern. Ich hoffe, dass es jetzt etwas verständlicher ist (Hab das im oberen Beitrag noch etwas fälschlich dargestellt, SRY).

Zur Vollständigkeit, ich verwende VS 2010 Ultimate, .NET 4.0 und Win7x64 Ultimate.

Gelöschter Account
vor 12 Jahren

Nein ich bin ehrlich gesagt noch verwirrter als vorher.

Wenn der Text in der Box im DropDownMenü vorhanden ist und du den Dropdown Button drückst wird der Text in der Box markiert. Wenn der Text nicht vorhanden ist ändert sich nichts. Ist kein Text in der Box passiert ebenfalls nichts. Du hast offentsichtlich weitere Event Trigger in der Box z.B. um ein DropDownItem zu löschen. Kannst du das vollständig posten dann teste ich das nach.

Klar wenn du Entf drückst wird markierter Text gelöscht, das ist ein Standardverhalten, das möchtest du wohl abschalten. Ein schmutziger Tricke wäre in deinem Formular KeyPreview auf True zu schalten und im KeyPress Event den Wert der Box zu speichern und danach zurück zu schreiben aber da gibt es ganz sicher einen besseren Weg. Ganz einfach, wenn auch unintuitiv wäre statt der Entf Taste eine andere Taste zu verwenden.

S
SirFoldabit Themenstarter:in
66 Beiträge seit 2008
vor 12 Jahren

Also mir ist gerade eine andere Möglichkeit eingefallen, wie ich meinen gewünschten Effekt erzielen könnte.
Ich könnte z.B. einfach ein ContextMenuStrip anzeigen, welches einen Delete-Eintrag enthält.
Ich habe das eben auch mal getestet allerdings erscheint das ContextMenu dann nur, wenn ich mit der Maus
einen Rechtsklick auf den Texteingabebereich der ComboBox mache.

Ich bräuchte das dann aber wenn man mit der Maus ein Element in der Liste der ComboBox selektiert
und dann per Rechtsklick das ContextMenu aufruft...das funktioniert aber leider nicht.

L
667 Beiträge seit 2004
vor 12 Jahren

Wenn ich Dein Problem richtig verstehe, soll bei Drücken von Entf der selektierte Eintrag in der Dropdown Liste gelöscht werden, nicht aber der aktuelle Text der Combobox.

In den KeyDownEventArgs gibt es einen Member Handled. Wenn Du diesen auf TRUE setzt, wir der Tastendruck nicht ausgeführt.

Daraus ergibt sich dann sowas (ungetesteter Pseudocode, hab gerade kein VS.NET zur Hand) :

if <gedrückte Taste> = "Entf"
eventArgs.Handled = true;

<code zum löschen des Eintrags aus der Dropdown Liste>

"It is not wise to be wise" - Sun Tzu

S
SirFoldabit Themenstarter:in
66 Beiträge seit 2008
vor 12 Jahren

Gute Idee Lynix aber das funktioniert leider nicht.

Ich glaube langsam irgendwie, dass das nicht geht, denn es wird sogar die Eingabe gelöscht, obwohl sie nicht markiert war.
D.h. auch wenn ich einen neuen Text im Textfeld der ComboBox eingebe, dann die Dropdownliste öffne und einen Eintrag selektiere,
ist die Eingabe im Textfeld der ComboBox nicht markiert und dennoch wird sie gelöscht, wenn ich ein Element der Dropdownliste lösche.

Code zum Löschen:


private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Delete && comboBox1.DroppedDown && comboBox1.Items.Count > 1)
    {
        e.Handled = true;
        comboBox1.Items.RemoveAt(comboBox1.SelectedIndex);
    }
}

771 Beiträge seit 2009
vor 12 Jahren

Hi,

hast du deinen Code mal mit einer anderen Taste probiert?
Evtl. löscht aber das RemoveAt automatisch den aktuellen Text. Dann merke dir diesen einfach vorher und setze ihn nach dem RemoveAt wieder zurück.

S
SirFoldabit Themenstarter:in
66 Beiträge seit 2008
vor 12 Jahren

@Cat: Hab das mit ner anderen Taste probiert und festgestellt, dass es egal ist, ob man "Remove" oder "RemoveAt" benutzt.
Das heißt, dass wohl "Remove" bzw. "RemoveAt" immer auch den aktuellen Text im Textfeld der ComboBox löscht.

R
158 Beiträge seit 2007
vor 12 Jahren

...Text im Textfeld der ComboBox eingebe, dann die Dropdownliste öffne und einen Eintrag selektiere,...

dann ist das Standardverhalten der Combobox doch so, dass das selektierte Item in der Dropdownliste oben in der Textbox erscheint/angezeigt wird.
Wenn nun das selektierte Item gelöscht wird, dann ist im Endeffekt kein Item mehr selektiert und somit kann dann auch nix mehr in der Textbox angezeigt werden.

Arrrghhhh... ich merke grad beim Testen, dass das blosse überfahren mit der Maus über einen Eintrag in der Dropdownliste schon den SelectedIndex setzt, also nicht erst beim explizieten Klick auf ein Item... 8o Das hätte ich jetzt nicht erwartet und JETZT verstehe ich auch das Beispielbild vom TS...

Aber.. ich glaube ich habe die Lösung des Problems gefunden:

		private void comboBox1_KeyDown(object sender, KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Delete && comboBox1.DroppedDown && comboBox1.Items.Count > 1 && comboBox1.SelectedIndex > -1)
			{//--Text merken der in der CB-Textbox steht
			 string cbtext = comboBox1.Text;
				e.Handled = true;
				comboBox1.Items.RemoveAt(comboBox1.SelectedIndex);
				//--gemerkten Text wieder einsetzen
				comboBox1.Text = cbtext;
			}

		}

Im Übrigen sollte man auch den Wert von SelectedIndex abfragen, da sonst bei -1 eine Exception geworfen wird.

MfG Rainer