C# Wie ausgewähltes Element einer Listbox ändern?

df8oe

Cadet 2nd Year
Registriert
Dez. 2013
Beiträge
22
Ich habe in Windows Forms eine Listbox erstellt, die während des Programmlaufs dynamisch mit Elementen gefüllt wird. Klappt auch - ein Element wählte ich mit .SelctedItem vor. Alles ok.

Man kann die anderen Elemente auch auswählen, alles gut soweit.

Nun kann es während des Programmlaufs vorkommen, dass in der Listbox (die auch während des Programmlaufs sichtbar ist) bei bestimmten Bedingungen automatisch (ohne Usereingriff) ein anderes Element ausgewählt werden muß. Und schon beginnen meine Probleme...

Egal, ob ich das neu selektierte Element mit .SelectedItem = "blablabla" oder mit .SelectedIndex = 4 ändere - die Anzeige ändert sich nicht. Auch ein .BeginUpdate() davor und ein .Endupdate() danach ändern daran nichts. Genausowenig, wie ein .Refresh() etwas bewirkt.

Wie kann ich während der Programmausführung das selektierte Element ohne Usereingriff vom Programm aus ändern? Kann ich ein "Benutzer hat etwas anderes ausgewählt-Ereignis" mit Programmcode auslösen?

Gruß
df8oe
 
Dummerweise funktionieren die von Microsoft dargestellten Wege bei mir nicht. Es bleibt das alte Element ausgewählt - was auch immer ich davon tue - siehe mein erstes Posting.

Diese Ergebnisse hatte ich vor 3 Stunden "herumprobieren" auch schon. Trotzdem danke - auch wenn es nicht zielbringend war :)

Gruß
df8oe
Ergänzung ()

Die übliche Microsoft-Vorgehensweise hat zum Ziel geführt.

Obwohl alle Elemente bereits "richtig" waren, habe ich für das Ändern der Auswahl alle Elemente gelöscht, dann mit .BeginUpdate() und.AddItem alle Elemente wieder zugefügt, wie in den Beiträgen von M$ beschrieben nun das entsprechende Element ausgewählt und dann mit .EndUpdate() das Ganze abgeschlossen.

Ohne, dass ich alle Elemente lösche und dann wieder einfüge geht es nicht!

Gruß
df8oe
 
Hallo,
ich verstehe dein Problem nicht. Setze doch einfach die SelectedIndex Eigenschaft der ListBox.

Code:
private void button1_Click(object sender, EventArgs e) {
  int maxIndex = this.listBox1.Items.Count - 1;
  Random random = new Random();
  int selectedIndex = random.Next(0, maxIndex);


  this.listBox1.SelectedIndex = selectedIndex; //Hier einfach den Index des zu aktivierenden Elements setzen
}

Genauso war es doch in den ersten beiden Google Treffern auch beschrieben.

Greetz
​hroessler
 
Zuletzt bearbeitet von einem Moderator:
Wenn ich den setze, bleibt das Element ausgewählt, was schon vorher ausgewählt war. Ob ich SelectedIndex einen Wert zuweise oder in China fällt ein Sack Reis um - keine Auswirkung - zumindest nicht auf die Anzeige in der Listbox. Wenn ich einen neuen Wert zuweise und danach den Wert auslese, bekomme ich den neu zugewiesenen Wert. Aber die Anzeigte auf dem Bildschirm bleibt auf dem alten Wert. Erst, wenn ich wie beschrieben alle Einträge lösche und die Liste dann neu befülle UND DANN DIE SELECTED.INDEX-EIGENSCHAFT BENUTZE - dann wird auch der richige Wert selektiert angezeigt.

Gruß
df8oe
 
Zeig' doch mal den Code, der nicht funktioniert.
 
Hast du eventuell weitere EventHandler an deiner ListBox hängen, falls ja, welche?

greetz
hroessler
 
Diese Codebeispiele funktionieren nicht:

BURST_SELECT.BeginUpdate();
BURST_SELECT.SelectedIndex = 4;
BURST_SELECT.EndUpdate();

oder

BURST_SELECT.SelectedIndex = 4;
BURST_SELECT.Update();

oder

BURST_SELECT.SelectedIndex = 4;
BURST_SELECT.Refresh();

In jedem Fall bleibt im Fenster der alte Wert angewählt. Ich kann einen neuen mit der Maus auswählen, und der wird dann sowohl angezeigt als kann ich ihn auch durch Lesen der SelectedIndex-Eigenschaft ermitteln.

In allen obigen Codebeispielen ist der neue Wert durch Lesen der SelectedIndex-Eigenschaft feststellbar, aber in der Listbox bleibt verwirrenderweise der alte Wert aktiv.

Folgendes Codebeispiel dagegen funktioniert:

BURST_SELECT.BeginUpdate();
int start = (int) Math.Round(Math.Round(magic[burst + 2]/1000))*1000;
for(int i=start; i >= 10000; i=i-500)
BURST_SELECT.Items.Add(i.ToString());
BURST_SELECT.SelectedIndex = 4;
BURST_SELECT.EndUpdate();

In der Schleife werden die gleichen Werte wieder in die Listbox eingetragen, die auch vorher drin waren.

Es gibt keine weiteren Eventhandler.

Gruß
df8oe
 
Irgendwas stimmt da nicht. Das hier funktioniert wunderbar:
Code:
        public Form1()
        {
            InitializeComponent();

            BURST_SELECT.BeginUpdate();
            int start = 15000;
            for (int i = start; i >= 10000; i = i - 500)
                BURST_SELECT.Items.Add(i.ToString());
            BURST_SELECT.SelectedIndex = 4;
            BURST_SELECT.EndUpdate();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Zufällig selektieren
            BURST_SELECT.SelectedIndex = new Random().Next(BURST_SELECT.Items.Count);
        }
(VS 2013, Net.4.5)

Kannst du evtl. das ganze Projekt hochladen? Du hast das Problem zwar schon "gelöst", würde mich aber trotzdem interessieren, warum es bei dir nicht so funktioniert.
 
Das ganze Projekt umfasst mittlerweilen 1500 Programmzeilen und ich kann den Block nicht besser heraustrennen als ich es schon gepostet habe. Auf jeden Fall funktioniert es genau so, wie Du es beschrieben hast, eben nicht. Und das waren die Lösungen, die ich auch schon im Netz gefunden hatte. Da die "Updates" nicht allzu häufig vorkommen und die Liste auch nur 40 Elemente umfasst, ist der Workaround von der Funktion her tragbar. Ich hätte zwar gerne verstanden, warum das nicht so geht wie in den Beispielen, aber da werde ich wohl nicht so schnell hinterblicken ;)

Eventuell liegt es auch an meiner VS-Version (2010 Express) oder an der Net-Version (4.0) - kann ich nicht festmachen...

Danke für alle Beiträge. Problem "umgangen" - nicht gelöst - aber man muss nicht alles verstehen :)

Gruß
df8oe
 

Ähnliche Themen

D
Antworten
2
Aufrufe
2.121
derBobby
D
Zurück
Oben