OVH Cloud OVH Cloud

Personnaliser la collection d'objets (de type ObjectCollection) d'une ListBox

4 réponses
Avatar
Boris Sargos
Bonjour,

quelqu'un pourrait-il me dire comment on peut personnaliser la collection
d'objets (de type ObjectCollection) d'une ListBox ?
Plus précisément, j'ai défini une classe ObjectCollectionFille dérivée de
ObjectCollection, et j'aimerais pouvoir "caster" le retour de ListBox.Items
comme suit :

ObjectCollectionFille mycollection = (ObjectCollectionFille)
mylistbox.Items

Ne pouvant accéder à l'implémentation de ListBox, et sachant que la
propriété Items est en lecture seule, je ne vois pas comment faire. Mais il
y a forcément un moyen, sinon à quoi servirait de pouvoir dériver
ObjectCollection et à pourquoi la propriété Items[int] renverrait-elle un
object au lieu d'un bête string ?


Merci pour vos réponses.

4 réponses

Avatar
Paul Bacelar
Je pense que vous fourvoyez.

"Une bête string" est bien moins générique qu'un objet qui peut contenir un
graphe d'objet cyclique ou une référence sur un objet distant. Si la
sérialisation (objet->chaîne de caractère) était si évidente, on se
demanderait bien pourquoi il y a autant de sérialisations différents et que
personne ne veuillent les faire et donc que les framework s'en chargent.

Si vous voulez faire de la vérification de type, utilisez une nouvelle
propriété qui check les valeurs en entrée et retourne le bon type en sortie.

mylistbox.My_Items.Add(new Mon_Type("toto"));

ObjectCollectionFille mycollection = mylistbox.My_Items



My_Items utilisera la propriété Items en interne et fera le caster pour vous
et de manière systématique.


--
Paul Bacelar
Demandeur d'emploi


"Boris Sargos" wrote in message
news:
Bonjour,

quelqu'un pourrait-il me dire comment on peut personnaliser la collection
d'objets (de type ObjectCollection) d'une ListBox ?
Plus précisément, j'ai défini une classe ObjectCollectionFille dérivée de
ObjectCollection, et j'aimerais pouvoir "caster" le retour de


ListBox.Items
comme suit :

ObjectCollectionFille mycollection (ObjectCollectionFille)
mylistbox.Items

Ne pouvant accéder à l'implémentation de ListBox, et sachant que la
propriété Items est en lecture seule, je ne vois pas comment faire. Mais


il
y a forcément un moyen, sinon à quoi servirait de pouvoir dériver
ObjectCollection et à pourquoi la propriété Items[int] renverrait-elle un
object au lieu d'un bête string ?


Merci pour vos réponses.




Avatar
Boris Sargos
Merci de m'avoir répondu, mais je crains de ne pas avoir tout saisi :

Je pense que vous fourvoyez.


A quel sujet ?


"Une bête string" est bien moins générique qu'un objet qui peut contenir


un
graphe d'objet cyclique ou une référence sur un objet distant. Si la
sérialisation (objet->chaîne de caractère) était si évidente, on se
demanderait bien pourquoi il y a autant de sérialisations différents et


que
personne ne veuillent les faire et donc que les framework s'en chargent.


???

Si vous voulez faire de la vérification de type, utilisez une nouvelle
propriété qui check les valeurs en entrée et retourne le bon type en


sortie.
mylistbox.My_Items.Add(new Mon_Type("toto"));


Si j'ai compris ce que tu veux dire, mylistbox est une instance d'une classe
dérivée de ListBox. Autrement dit, je dois créer une classe dérivée de
ListBox, avec un code du genre :

public new ObjectCollectionFille My_Items {
get { return (ObjectCollectionFille) Items; }
}
Donc, là, je n'ai rien compris !


Merci de m'éclairer un peu :-(
Avatar
Paul Bacelar
Je ne suis pas clair en effet car j'ai du mal à savoir où est ton problème.

ListBox est une classe concrète qui à un mode de fonctionnement assez
rigide.

Pouvez-vous nous décrire le problème au quel la solution de la
personnalisation de la collection d'objet répond.

J'ai du mal à savoir si c'est la collection ou les objets de la collection
qu'il faut personnaliser.
--
Paul Bacelar
Demandeur d'emploi


"Boris Sargos" wrote in message
news:
Merci de m'avoir répondu, mais je crains de ne pas avoir tout saisi :

> Je pense que vous fourvoyez.
A quel sujet ?


> "Une bête string" est bien moins générique qu'un objet qui peut contenir
un
> graphe d'objet cyclique ou une référence sur un objet distant. Si la
> sérialisation (objet->chaîne de caractère) était si évidente, on se
> demanderait bien pourquoi il y a autant de sérialisations différents et
que
> personne ne veuillent les faire et donc que les framework s'en chargent.
???

> Si vous voulez faire de la vérification de type, utilisez une nouvelle
> propriété qui check les valeurs en entrée et retourne le bon type en
sortie.
> mylistbox.My_Items.Add(new Mon_Type("toto"));
Si j'ai compris ce que tu veux dire, mylistbox est une instance d'une


classe
dérivée de ListBox. Autrement dit, je dois créer une classe dérivée de
ListBox, avec un code du genre :

public new ObjectCollectionFille My_Items {
get { return (ObjectCollectionFille) Items; }
}
Donc, là, je n'ai rien compris !


Merci de m'éclairer un peu :-(




Avatar
Boris Sargos
D'accord, voici mon problème. Il n'est pas très grave, puisque je peux le
contourner. Mais ça alimente la conversation ...

Alors voilà.
En fait, à chaque ListBox est associée une collection de type
ObjectCollection. Cette collection stocke des objets de type object, ce qui
est on ne peut plus générique.

Hors, justement, j'ai créé un contrôle MyListControl (qui contient un
ListBox) qui ne stocke qu'un type d'objet : MyItem. Pour que mon code soit
élégant, j'aurais souhaité que la propriété Items de MyListControl retourne
une collection d'objets déjà castés MyItem. L'idée était donc tout
simplement de dériver ObjectCollection en MyItemCollection pour pouvoir
écrire un code avec des déclarations proches de :

MyItemCollection MyListControl.Items { } //
Au lieu de ObjectCollection MyListControl.Items {}
MyItem MyListControl.Items[int];
// Au mieu de object MyListControl.Items[int];

Tu trouveras peut-être que l'intérêt d'une telle chose est limité. Et tu
auras raison. Si je n'ai pas été clair, cela n'est pas grave, on laissera
tomber !

Voilà. Merci.