Le problème que je remarque est cette ligne de code:
tempList.Add(orderables);
Dans ce code complet:
AssociatedComboItems ai = new AssociatedComboItems(); List tempList = new List(); Orderables orderables = new Orderables(); foreach (var t in comboBox1.Items) { ai.ComboBoxItem = t.ToSsortingng(); for (int i = 0; i < fpSpread1.ActiveSheet.RowCount; i++) { orderables.Display = fpSpread1.ActiveSheet.Cells[i, 1].Text; orderables.ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value; orderables.DisplayOrder = i; tempList.Add(orderables); } ai.AssociatedItems = tempList; tempList.Clear(); if(AssociatedItems == null) AssociatedItems = new List(); AssociatedItems.Add(ai); }
Lorsque je mets mon point d’arrêt sur la ligne mentionnée ci-dessus ( tempList.Add(orderables);
( tempList.Add(orderables);
), la première fois qu’il ajoute l’élément correctement au templist
, il y aura un élément. La deuxième fois, il appenda le bon élément à la liste, mais si je survole la liste tempList
et que tempList
veux voir son contenu, bien qu’il ait deux éléments, les deux sont identiques, c’est maintenant le deuxième élément ajouté à liste. Il a écrasé le premier.
Je ne peux pas comprendre ce qui ne va pas avec cela et pourquoi cela se produit.
Vous devez instancier les éléments Orderables
dans la boucle for; sinon, vous continuez à réutiliser la même instance dans toutes les itérations (et à écraser ses propriétés à chaque fois).
AssociatedComboItems ai = new AssociatedComboItems(); List tempList = new List (); foreach (var t in comboBox1.Items) { ai.ComboBoxItem = t.ToSsortingng(); for (int i = 0; i < fpSpread1.ActiveSheet.RowCount; i++) { Orderables orderables = new Orderables(); // ← Instantiate here orderables.Display = fpSpread1.ActiveSheet.Cells[i, 1].Text; orderables.ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value; orderables.DisplayOrder = i; tempList.Add(orderables); } ai.AssociatedItems = tempList; tempList.Clear(); if(AssociatedItems == null) AssociatedItems = new List(); AssociatedItems.Add(ai); }
Non lié à la question: Vous pouvez trouver la syntaxe d’ initialisation d’object plus propre:
Orderables orderables = new Orderables { Display = fpSpread1.ActiveSheet.Cells[i, 1].Text, ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value, DisplayOrder = i, };
Le problème est que vous ne possédez qu’une seule instance de points à commander et que vous continuez à modifier la même instance et à l’append de nouveau à la liste. Chaque référence dans la liste pointe vers le même object. Déplacez la déclaration orderables à l’intérieur de la boucle for interne et cela résoudra le problème.