Gestion de ListBox et BDD en C#

Misdrhaal -  
 Misdrhaal -
Bonjour,

je travaille actuellement sur un projet en asp.net (langage utilisé : C#)

Mon problème est le suivant : j'ai deux listbox en multiselection. je peux transférer des items d'une liste à l'autre (dans les deux sens).

Chaque item de cette liste possède un code (correspondant à une clé primaire pour une table de référence).

Les deux listes sont : la liste des codes n'étant pas référencés par la table, et la liste dont les codes sont référencés dans la table.

Le but est donc de mettre à jour cette table de référence en prenant en compte les transferts d'items qui ont été effectués entre ces deux listes.

(Si vous ne suivez pas, dites-le je réexpliquerai plus en détails)


Mon interface se compose ainsi :

Les deux listes en vis à vis avec entre les deux, deux boutons, un prou transférer de gauche à droite, l'autre droite à gauche.

Et enfin sous les list,e un unique bouton pour valider les changements. (et donc mettre à jour la base).

Les evenements liés à ces boutons sont :

		private void IB_DropAgence_onClick(object sender, System.Web.UI.ImageClickEventArgs e)
		{
			DeplacerItemEntreListes(this.LB_AgencesRattachees, this.LB_AgencesProposees);
		}

		private void IB_AddAgence_onClick(object sender, System.Web.UI.ImageClickEventArgs e)
		{
			DeplacerItemEntreListes(this.LB_AgencesProposees, this.LB_AgencesRattachees);
		}

		private void DeplacerItemEntreListes(ListBox LB_Depart, ListBox LB_Arrivee)
		{
			int i=0;
			ArrayList arlistdep,arlistarr;  
			while (i<=LB_Depart.Items.Count-1)
			{
				if (LB_Depart.Items[i].Selected)
				{
					ListItem listtrans = LB_Depart.Items[i];
					LB_Arrivee.Items.Add(listtrans);
					LB_Depart.Items.RemoveAt(i);
				}
				else i++;
			}
			
			//On trie la liste d'arrivée 		
			arlistarr = new ArrayList(LB_Arrivee.Items);
			arlistarr.Sort(new CompareListItem());
			LB_Arrivee.Items.Clear();
			foreach(ListItem item in arlistarr)
			{
				LB_Arrivee.Items.Add(item);
			}
		}



Et j'ai aussi lié un évènement au bouton valide (pas encore rempli c'est bien la le problème^^)

private void IB_ValideTransfert_onClick(object sender, System.Web.UI.ImageClickEventArgs e)
		{
			Enregistrer_Changements();
		}





Donc ma question est la suivante : comment détecter facilement les changement effectués dans les deux listes?
J'avais pensé à détecter les items sélectionnés dans ma méthode Enregistrer_changements, le problème est que cette selection disparait, dès que l'utilisateur clique dans la listbox.

J'avais aussi pensé à comparer les codes présents et absents de chaque liste par rapport aux listes initiales stockées dans des array_lists (à l'aide de boucles), mais je me demandais s'il y avait plus... malin^^

donc voila le petit probèlme que je vous soumets,
en espérant que vous trouverez, je cherche de mon côté et si j'ai une réponse plus intelligente que celle proposée ci-dessus, je vous en ferai part...

Merci de votre attention
A voir également:

1 réponse

Misdrhaal
 
Je n'ai pas trouvé de méthode intelligente, j'ai donc testé deux façons de faire :

Declaration d'une array_list comme membre de classe, cette AL contient une des listes initiales.

Et ma fonction enregistrer se comporte ainsi :

this.ArrListRatMAJ = new ArrayList(this.LB_AgencesRattachees.Items);
			
			
			//Pour ajouter
			foreach(ListItem item in this.ArrListRatMAJ) //Chaque item se trouvant dans la liste finale
			{
				if(!this.ArrListRatdep.Contains(item)) //Non contenus dans la liste initiale
				{
					//ont été ajoutés 
					//Ajouterdansbase();
				}
			}

			//Pour supprimer
			foreach(ListItem item in this.ArrListRatdep) //Chaque item se trouvant dans la liste initiale
			{
				if(!this.ArrListRatMAJ.Contains(item)) //Non contenus dans la liste finale
				{
					//ont été supprimés 
					//Supprimerdelabase();
				}
			}		



L'autre méthode (je n'ai plus le code), consistait à prendre l'AL, de faire une autre AL à partir de la liste finale, et d'envoyer ces deux AL à une fonction qui se chargeait de faire un addRange() de l' AL final sur l'AL global, en supprimant les doublons, et ensuite un RemoveRange sur l'AL initial.
Je ne gardais ainsi que la liste des éléments ajoutés....

Je faisais pareil pour l'autre listbox et j'avais donc les elements ajoutés dans les deux listes (et par conséquent les éléments ajoutés et supprimé dans les deux listes)

J'ai choisi de faire la premiere méthode afin de n'avoir que deux listes à gérer au lieu de 4... gain de clarté non négligeable ^^.


Voila voila,
par contre j'aimerais que ce poste ne soit pas fermé, car je suis toujours preneur pour une idée intelligente concernant le probleme (c'est à dire élégante, performante, et se servant principalement voire totalement du côté objet du C# ^^)
2