listbox.Items.Count est à 0 alors qu'il y a des items dans la liste.
Salut à toutes et à tous,
Soit 2 listbox multiselect, chacune alimentée par une sqldatasource.
Soit 2 boutons entre les listbox.
Voici les codes ASP des listes :
Code:
1 2 3 4 5
|
<asp:ListBoxID="ListBoxLotsSelectionnables"runat="server"BackColor="#EFF3FB"
DataSourceID="SqlDataSourceNouveauxLotsDuMandat"DataTextField="num_nouv_lot"
DataTextFormatString="{0:0,0}"DataValueField="num_nouv_lot"Rows="10"Width="95px"SelectionMode="Multiple">
</asp:ListBox> |
Code:
1 2 3 4 5
|
<asp:ListBoxID="ListBoxLotsSelectionnes"runat="server"BackColor="#EFF3FB"
DataSourceID="SqlDataSourceLotsSelectionnes"DataTextField="num_nouv_lot"
DataTextFormatString="{0:0,0}"DataValueField="num_nouv_lot"Rows="10"Width="95px"SelectionMode="Multiple">
</asp:ListBox> |
Le but :
Transférer les items sélectionnés d'une listbox dans l'autre.
Le code :
J'ai créé une fonction qui transfère les éléments d'une liste A vers une liste B.
Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
privatevoid Alimenter_ListeA_par_ListeB(ListBox ListBoxDestination, ListBox ListBoxOrigine)
{
ListItemCollection ToDelete = newListItemCollection();
foreach (ListItem item in ListBoxOrigine.Items)
{
if (item.Selected)
{
ListBoxDestination.Items.Add(item);
ToDelete.Add(item);
}
}
foreach (ListItem item in ToDelete)
{
ListBoxOrigine.Items.Remove(item);
}
#region Tri de la liste de destination
ListItemCollection c = ListBoxDestination.Items;
ListItem[] items = newListItem[c.Count];
c.CopyTo(items, 0);
System.Array.Sort(items, newmyListItemComparer());
ListBoxDestination.Items.Clear();
ListBoxDestination.Items.AddRange(items);
#endregion
#region D‚s‚lectionner tous les ‚l‚ments des 2 listes
ListBoxOrigine.ClearSelection();
ListBoxDestination.ClearSelection();
#endregion
} |
Sur le click du bouton dans un sens :
Code:
1 2 3 4 5
|
protectedvoid ButtonAddLotSelectionne_Click(object sender, EventArgs e)
{
Alimenter_ListeA_par_ListeB(ListBoxLotsSelectionnes, ListBoxLotsSelectionnables);
} |
Sur le click du bouton dans le sens inverse :
Code:
1 2 3 4 5 6
|
protectedvoid ButtonRemoveLotSelectionne_Click(object sender, EventArgs e)
{
Alimenter_ListeA_par_ListeB(ListBoxLotsSelectionnables, ListBoxLotsSelectionnes);
}
|
Dans le sens Liste 2 vers liste 1, ça fonctionne, mais dans le sens liste 1 vers liste 2 (ButtonAddLotSelectionne_Click), on dirait qu'il remet toujours la liste à 0 avant d'ajouter les items. Il n'ajoute pas les éléments à la liste mais remplace ceux de la liste par ceux sélectionnés dans l'autre liste.
Je ne comprend pas ce fait vu que les listes sont identiques, à l'exception du sqldatasource et que les 2 boutons appellent la même procédure. Elles sont tellement identiques que comme je pensais m'être trompé dans la seconde, jai fait une copie de la première en ne changeant que le sqldatasource.
Lorsque je met une break sur ButtonAddLotSelectionne_Click, il me dit à la première ligne de la procédure que
ListBoxLotsSelectionnes.Items.Count est à 0, or la liste contient des éléments.
Ensuite il ajoute bien les éléments sélectionnés de la première liste et retourne effectivement le
ListBoxLotsSelectionnes.Items.Count avec le nombre d'items ajoutés.
Une fois la procédure achevée, je vois effectivement les éléments qui étaient sélectionnés dans la première liste qui sont passés dans la seconde.
Si je relance la procédure, le
ListBoxLotsSelectionnes.Items.Count est de nouveau à 0.
Pourquoi et quelle est la différence que je ne vois pas entre ces 2 :furieux: listes ?
Merci de vos z'avis z'avisés,
Jean-Marc