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 : Sélectionner tout - Visualiser dans une fenêtre à part
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>Le but :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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>
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:
Sur le click du bouton dans un sens :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 le sens inverse :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 protectedvoid ButtonAddLotSelectionne_Click(object sender, EventArgs e) { Alimenter_ListeA_par_ListeB(ListBoxLotsSelectionnes, ListBoxLotsSelectionnables); }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 protectedvoid ButtonRemoveLotSelectionne_Click(object sender, EventArgs e) { Alimenter_ListeA_par_ListeB(ListBoxLotsSelectionnables, ListBoxLotsSelectionnes); }
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 2listes ?
Merci de vos z'avis z'avisés,
Jean-Marc
Partager