OVH Cloud OVH Cloud

Combobox : détecter ajout/retrait élément

40 réponses
Avatar
Gloops
Bonjour tout le monde,

Est-ce qu'un ComboBox (ou un ListBox, j'imagine que la r=E9ponse est la=20
m=EAme) d=E9clenche un =E9v=E9nement lorsqu'on lui ajoute un =E9l=E9ment =
(Items.Add)=20
ou qu'on en retire un (Items.Remove), ou doit-on g=E9rer soi-m=EAme un=20
delegate ?

Dans le premier cas je suis pass=E9 devant sans voir ...

10 réponses

1 2 3 4
Avatar
Christophe Lephay
"Gloops" a écrit dans le message de groupe de
discussion : #
Christophe Lephay a écrit, le 02/12/2008 17:49 :
J'ai le flemme de vérifier, mais il est probable que ça fasse la même
chose si tu ajoutes un élément à travers
ma_liste_deroulante.Items.Add(...) : la propriété Items sera redirigée de
toute façon vers la BindingList.




Aïe, il semblerait qu'il y a un paquet de trucs qu'il est grand temps
que je révise.

Quand je vois

BindingList<string> ma_liste;
ma_liste = new BindingList<string>();

je me dis que pour ajouter un élément ça se passe comme ça :
string strNouv = ma_liste.AddNew();



Le AllowNew n'est pas utile. Il sert surtout lorsque tu veux permettre
l'ajout dans un grid, qui se fait typiquement en plusieurs étapes (création
d'une ligne vide, puis validation ou annulation).

Dans ton cas, il te suffit de faire :

string s = "blabla";
ma_liste.Add(s);

ou même : ma_liste_deroulante.Items.Add(s);

qui devrait revenir exactement au même.
Avatar
Christophe Lephay
"Jérémy Jeanson" a écrit dans le message de groupe
de discussion :
En lisant la MSDN j'ai constaté qu'il fallait autorisé l'ajout d'item
avant d'en ajouter :)



Nop.

AllowNew autorise juste l'ajout d'un item *vide* à travers AddNew, qui sera
ensuite validé ou annulé (si l'item implémente IEditable). La classe de
l'item doit bien sur avoir un constructeur par défaut.


String strNouv = "ma string";
ma_liste.Add(strNouv);



Ce code devrait marcher sans toucher à AllowNew.
Avatar
Gloops
Christophe Lephay a écrit, le 04/12/2008 16:24 :
String strNouv = "ma string";
ma_liste.Add(strNouv);



Ce code devrait marcher sans toucher à AllowNew.



J'y suis !
Il fallait mettre Add au lieu de AddNew.

Ah ben c'est que je ne l'ai pas vu tout de suite en lisant ceci, en
plus. C'est après avoir fait des copies d'écran pour recopier
l'infobulle que je me suis rendu compte que ce que je venais de recopier
n'était pas ce qui m'était suggéré ici.

Eh bien merci de m'avoir encore une fois ramené sur le bon chemin, sino n
j'étais parti à essayer d'implémenter des trucs qui n'ont pas besoi n de
l'être.

Donc, si j'ai bien compris cette fois, AddNew pour ajouter une valeur
vide (enfin ... nulle), Add pour ajouter une valeur connue.

Maintenant que l'instruction a été exécutée je peux partir du pri ncipe
que la valeur a été valablement ajoutée, il ne me restera plus ce s oir
qu'à voir ce qu'il en est de ... l'interface utilisateur.
Avatar
Christophe Lephay
"Gloops" a écrit dans le message de groupe de
discussion :
Donc, si j'ai bien compris cette fois, AddNew pour ajouter une valeur vide
(enfin ... nulle)



AddNew appelle le contructeur par défaut du type d'objet que géré, et
ajoutera donc à la liste un objet tout ce qu'il y a de plus valide (et non
pas une référence nulle).
Avatar
Gloops
Christophe Lephay a écrit, le 04/12/2008 18:18 :
"Gloops" a écrit dans le message de group e
de discussion :
Donc, si j'ai bien compris cette fois, AddNew pour ajouter une valeur
vide (enfin ... nulle)



AddNew appelle le contructeur par défaut du type d'objet que géré , et
ajoutera donc à la liste un objet tout ce qu'il y a de plus valide (e t
non pas une référence nulle).




Ah, c'est pour ça qu'on me reproche que string n'a pas de constructeur
par défaut.

Que voilà une intervention utile :)
Avatar
Gloops
Les choses commencent à présent à prendre bonne tournure.

Le bouton d'ajout ajoute une valeur dans "ma_liste" (celle qui est tapé e
dans la liste combinée), le bouton de suppression retire une valeur dan s
"ma_liste" (celle qui est sélectionnée dans la liste combinée), et la
modification d'éléments dans "ma_liste" provoque :

public void majListeFormats(Object Sender, ListChangedEventArgs
evArgs)
{
MessageBox.Show("Mise à jour");
cmbFormats.Items.Clear();
for (int i = 0; i < ma_liste.Count; i++)
{
cmbFormats.Items.Add(ma_liste[i]);
}
}

Et, effectivement, je vois les éléments s'ajouter dans la liste ou en
disparaître à mesure que je les crée et que je les supprime. Il me reste
à réactiver la gestion des doublons que j'ai supprimée pour simplif ier
les tests à une certaine phase.

Il faudra aussi vérifier, lors de la demande de suppression d'un
élément, qu'il s'agisse bien d'un élément existant (ce qui n'est pas le
cas si l'utilisateur a saisi quelque chose, et demandé la suppression
sans avoir demandé la création). Bref, plus que du tout venant, sembl e-t-il.

Ensuite, une fois que j'aurai une gestion correcte des éléments avec une
procédure qui transfère la liste vers le contrôle de liste déroul ante,
il sera simple d'ajouter l'écriture dans un fichier dans la même
procédure, ce qui était bien la question initiale. Donc, CQFD.

Pour le moment, il me reste à me rappeler que la nuit est faite pour
dormir, mais le reste ne devrait guère tarder. Merci aux intervenants.
Avatar
Christophe Lephay
"Gloops" a écrit dans le message de groupe de
discussion : #
Le bouton d'ajout ajoute une valeur dans "ma_liste" (celle qui est tapée
dans la liste combinée), le bouton de suppression retire une valeur dans
"ma_liste" (celle qui est sélectionnée dans la liste combinée), et la
modification d'éléments dans "ma_liste" provoque :

public void majListeFormats(Object Sender, ListChangedEventArgs
evArgs)
{
MessageBox.Show("Mise à jour");
cmbFormats.Items.Clear();
for (int i = 0; i < ma_liste.Count; i++)
{
cmbFormats.Items.Add(ma_liste[i]);
}
}

Et, effectivement, je vois les éléments s'ajouter dans la liste ou en
disparaître à mesure que je les crée et que je les supprime. Il me reste à
réactiver la gestion des doublons que j'ai supprimée pour simplifier les
tests à une certaine phase.



Note que ton code, qui met à jour ta combobox, devrait être inutile avec un
:
cmbFormats.DataSource = ma_liste;
Avatar
Gloops
Christophe Lephay a écrit, le 05/12/2008 06:54 :
Note que ton code, qui met à jour ta combobox, devrait être inutile avec
un :
cmbFormats.DataSource = ma_liste;



Effectivement, je l'avais lâché en route, ça.
Je note aussi que si je fais ça, la valeur de la liste déroulante cha nge
lorsque j'ajoute un élément à ma_liste. Il faut donc la sauvegarder dans
une variable, ce qui n'était pas le cas avec la méthode "marteau-buri n".

Et alors je laisse quand même la boucle, mais pour écrire dans le
fichier. Ou j'ai aussi loupé un truc du même style ? Il me semble qu' on
en avait parlé aussi ...

ma_liste n'a pourtant pas de propriété Source ou DataSource ou File . ..
Avatar
Christophe Lephay
"Gloops" a écrit dans le message de groupe de
discussion :
Christophe Lephay a écrit, le 05/12/2008 06:54 :
Note que ton code, qui met à jour ta combobox, devrait être inutile avec
un :
cmbFormats.DataSource = ma_liste;



Effectivement, je l'avais lâché en route, ça.
Je note aussi que si je fais ça, la valeur de la liste déroulante change
lorsque j'ajoute un élément à ma_liste. Il faut donc la sauvegarder dans
une variable, ce qui n'était pas le cas avec la méthode "marteau-burin".



Ben c'est à toi de voir si tu veux qu'elles soient synchronisées ou non...

Et alors je laisse quand même la boucle, mais pour écrire dans le fichier.
Ou j'ai aussi loupé un truc du même style ? Il me semble qu'on en avait
parlé aussi ...



Comment ton fichier et ta liste vont se synchroniser, c'est à toi de le code
:)
Avatar
Gloops
Bon, ben alors je crois bien qu'on y est.

Maintenant je vais ajouter une option pour sauvegarder le format par
défaut, plus encore quelques tests et je crois bien qu'il n'y aura plus
qu'à mettre en ligne.

Encore merci pour tout.
________________________________________________
Christophe Lephay a écrit, le 05/12/2008 11:54 :
"Gloops" a écrit dans le message de group e
de discussion :
Christophe Lephay a écrit, le 05/12/2008 06:54 :
Note que ton code, qui met à jour ta combobox, devrait être inuti le
avec un :
cmbFormats.DataSource = ma_liste;



Effectivement, je l'avais lâché en route, ça.
Je note aussi que si je fais ça, la valeur de la liste déroulante
change lorsque j'ajoute un élément à ma_liste. Il faut donc la
sauvegarder dans une variable, ce qui n'était pas le cas avec la
méthode "marteau-burin".



Ben c'est à toi de voir si tu veux qu'elles soient synchronisées ou non...

Et alors je laisse quand même la boucle, mais pour écrire dans le
fichier. Ou j'ai aussi loupé un truc du même style ? Il me semble
qu'on en avait parlé aussi ...



Comment ton fichier et ta liste vont se synchroniser, c'est à toi de le
code :)


1 2 3 4