Laden...

ListBox: ListBox.SelectedIndices.Count ändert sich wärend der Bearbeitung

Erstellt von Xand0r vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.047 Views
Xand0r Themenstarter:in
82 Beiträge seit 2009
vor 15 Jahren
ListBox: ListBox.SelectedIndices.Count ändert sich wärend der Bearbeitung

Hallo,
ich arbeite grad an einer ListBox in der man Einträge markieren kann und durch einen Klick auf ein Button sollen die Einträge dann speziell markiert werden (dass sie zu einer Schleife gehören), das ganz passiert mit folgendem Code:


for (int i = 0; i < list_1_ind.Count; i++)
                    {
                        textBox1.Text += list_in.Items[list_1_ind[i]] + "\r\n";
                        list_in.Items[list_1_ind[i]] = "--->" + list_in.Items[list_1_ind[i]];
                    }
list_in.Items.Insert(list_1_ind[0], "Schleifenanfang (" + txt_wend.Text + ")");
list_in.Items.Insert(list_1_ind[list_1_ind.Count - 1] + 1, "Schleifenende (" + txt_count.Text + ")");


Wobei list_1_ind eine ListBox.SelectedIndicesCollection ist, list_in ist die fragliche ListBox, txt_count ist eine Textbox in der die Anzahl angegeben wird.
Problem ist nun folgendes (habs mal im Debugger untersucht): Wenn ich erst einen Eintrag markiere und die Ergänzungen hinzufüge klappt alles wunderbar. Markier ich dann aber die komplette Schleife, also:


Schleifenanfang (2)
--->BlaBla
Schleifenende

so wird list_1_ind.Count nach dem zweiten Durchgang der for-Schleife auf 2 gesetzt und der letzte Eintrag wird entsprechend ignoriert. Ich hab nun keine Ahnung, warum. Vielleicht könnt ihr mir ja sagen, wieso der das runtergesetzt wird???
Danke,

Xand0r

Diskordianer schwimmen nicht gegen den Strom - sie klettern aus dem Fluss! Ein Mathematiker ist ein Mensch, der einen ihm vorgetragenen Gedanken nicht nur sofort versteht, sondern auch weiß auf welchem Denkfehler er beruht
Gelöschter Account
vor 15 Jahren

die variablenbezeichnungen sind sehr kryptisch und der quellcodeauszug ist vermutlich nciht vollständig.

Xand0r Themenstarter:in
82 Beiträge seit 2009
vor 15 Jahren

Also der Code ist natürlich nicht vollständig, aber das ist die Stelle an der der Fehler auftritt, wie gesagt, wenn ich folgende drei Einträge in der ListBox (list_in) markieren:


Schleifenanfang (2)
--->BlaBla
Schleifenende

so passiert folgendes:

  1. Der Eintrag "Schleifenanfang (2)" wird in "--->Schleifenanfang (2)" geändert (list_1_ind.Count = 3 / wobei list_1_ind = list_in.SelectedIndices)
  2. Der Eintrag "--->BlaBla" wird in "--->--->BlaBla" geändert (list_1_ind.Count = 2, da passiert der Fehler, wieso und warum weiß ich nicht).
  3. Schleife ist beendet
Diskordianer schwimmen nicht gegen den Strom - sie klettern aus dem Fluss! Ein Mathematiker ist ein Mensch, der einen ihm vorgetragenen Gedanken nicht nur sofort versteht, sondern auch weiß auf welchem Denkfehler er beruht
49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Xand0r,

merke dir list_1_ind.Count vor der Schleife in einer int-Variablen und benutze diese in der Schleifenbedingung.

herbivore

Xand0r Themenstarter:in
82 Beiträge seit 2009
vor 15 Jahren

Hatte ich auch schon versucht, interessanterweise ändert sich aber auch die int-Variable während der Laufzeit und wird um 1 verringert.

Diskordianer schwimmen nicht gegen den Strom - sie klettern aus dem Fluss! Ein Mathematiker ist ein Mensch, der einen ihm vorgetragenen Gedanken nicht nur sofort versteht, sondern auch weiß auf welchem Denkfehler er beruht
Gelöschter Account
vor 15 Jahren

die int-variable kann sich nicht ändern, wenn du sie nciht explizit änderst.

Xand0r Themenstarter:in
82 Beiträge seit 2009
vor 15 Jahren

So, ich hab das jetzt so gelöst, dass ich die Indices in ein int-Array schreibe, damit funktioniert es.
Wobei immernoch die Frage bleibt warum sich die Collection ändert?

Diskordianer schwimmen nicht gegen den Strom - sie klettern aus dem Fluss! Ein Mathematiker ist ein Mensch, der einen ihm vorgetragenen Gedanken nicht nur sofort versteht, sondern auch weiß auf welchem Denkfehler er beruht
49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Xand0r,

vermutlich, weil du Änderungen an der Collection vornimmst. ListBox.Items und ListBox.SelectedItems hängen ja zusammen.

herbivore

Xand0r Themenstarter:in
82 Beiträge seit 2009
vor 15 Jahren

Ja, aber ändert sich denn, welche Items ich ausgewählt habe (das sind ja die ListBox.SelectedItems), wenn ich sie bearbeite und wenn ja, warum dann nur bei manchen?

Diskordianer schwimmen nicht gegen den Strom - sie klettern aus dem Fluss! Ein Mathematiker ist ein Mensch, der einen ihm vorgetragenen Gedanken nicht nur sofort versteht, sondern auch weiß auf welchem Denkfehler er beruht
49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Xand0r,

tiefer als bisher geschehen, kann ich nicht in dein Programm schauen. Du kannst jedoch davon ausgehen, dass es einen nachvollziehbaren Grund geben wird. Im Zweifel solltest du den Ablauf im Debugger untersuchen.

herbivore

Xand0r Themenstarter:in
82 Beiträge seit 2009
vor 15 Jahren

Ich hab mir den Ablauf jetzt mal wirklich ganz genau angeguckt und festgestellt, dass beim zweiten Schleifendurchgang der State-Wert des zweiten Items (sowohl in der SelectedItems- als auch SelectedIndices-Collection) von 1 auf 0 gesetzt wird und SelectedItem.Count wie auch SelectedIndices.Count von 3 auf 2 gesetzt werden. So wie ich die Sache sehe, ist das zweite Item nach dem zweiten Durchlauf der for-Schleife nicht mehr ausgewählt und zählt deshalb nicht mehr zu den Selected-Collections, nur warum es abgewählt wird, hab ich noch nicht rausgefunden (den Ausgewählt-Status per SetSelected(i,true) innerhalb der Schleife definitiv zu setzen hat auch nicht funktioniert, wobei der State-Wert noch vor Ausführung von SetSelected auf 0 gesetzt wird, danach dann aber bei 0 bleibt).

Diskordianer schwimmen nicht gegen den Strom - sie klettern aus dem Fluss! Ein Mathematiker ist ein Mensch, der einen ihm vorgetragenen Gedanken nicht nur sofort versteht, sondern auch weiß auf welchem Denkfehler er beruht
Gelöschter Account
vor 15 Jahren

wie wäre es denn, wenn du dir die selektierten items in einem eigenem array merkst?

Xand0r Themenstarter:in
82 Beiträge seit 2009
vor 15 Jahren

Wie gesagt, ich schreib mir die SelectedIndices in ein seperates int-Array und damit funktioniert es jetzt. Ich würde halt aber trotzdem gern wissen, wo bei dem ursprünglichen Ansatz der Fehler ist, d.h. warum er überhaupt auftritt, an sich ist das Problem ja gelöst.

Diskordianer schwimmen nicht gegen den Strom - sie klettern aus dem Fluss! Ein Mathematiker ist ein Mensch, der einen ihm vorgetragenen Gedanken nicht nur sofort versteht, sondern auch weiß auf welchem Denkfehler er beruht
Gelöschter Account
vor 15 Jahren

ich würde sagen, das es daran liegt, das du die auflistung veränderst. strings sind immutable, das bedeutet, das du bei jeglicher veränderung eines strings immer eine neue instanz von string erstellst.

du machst ja an einer stelle "mylist.item[x] = "--->" + mylist.item[x]"
hier wird eine neue instanz von tring gebilded (andere referenz und anderer hashcode) und somit ist das alte "selected" nicht mehr gültig, da an genau der selben stelle gerade ein neues objekt zugewiesen wurde.

Xand0r Themenstarter:in
82 Beiträge seit 2009
vor 15 Jahren

Das hatte ich mir ja auch erst gedacht, allerdings tritt der Fehler nicht immer auf. Wenn ich ich bspw. zwei Einträge markiere, funktioniert es, bei dreien fehlt der letzte, bei vier Einträgen wird auch nur der dritte ignoriert, bei fünf der dritte und fünfte, und so weiter. Daran kann es also nicht liegen. Warum auch immer, es werden halt einige Items nicht mehr ausgewählt und verschwinden so aus den entsprechenden Collections, selbst wenn ich sie danach wieder explizit über SetSelect auswähle sind sie nicht drin, alles sehr seltsam.

Diskordianer schwimmen nicht gegen den Strom - sie klettern aus dem Fluss! Ein Mathematiker ist ein Mensch, der einen ihm vorgetragenen Gedanken nicht nur sofort versteht, sondern auch weiß auf welchem Denkfehler er beruht