Propriété Collection qui n'en fait rien qu'à sa tête

Résolu
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 - 30 août 2009 à 00:19
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 - 30 août 2009 à 20:19
Bonjour tout le monde

Alors voilà, je me suis mis en tête, présomptueux que je suis,
de tester les Propriétés Collections dans un Control hérité
de la classe ContainerControl.

Je vous expose d'abort le code concerné:

En 1er la classe collection pour MonControl
Public Class MonControlCollection
Inherits System.Collections.CollectionBase

Default Public Property Item(ByVal Index As Integer) As MonControl
Get
Return CType(List(index), MonControl)
End Get
Set(ByVal value As MonControl)
List(Index) =  value
End Set
End Property

Public Function Add(ByVal value As MonControl) As Integer
Return List.Add(value)
End Function

Public Function IndexOf(ByVal value As MonControl) As Integer
Return List.IndexOf(value)
End Function

Public Sub Insert(ByVal Index As Integer, ByVal value As MonControl)
List.Insert(Index, value)
End Sub

Public Sub Remove(ByVal value As MonControl)
List.Remove(value)
End Sub

Public Function Contains(ByVal value As MonControl) As Boolean
Return List.Contains(value)
End Function

Protected Overrides Sub OnValidate(ByVal value As Object)
If Not GetType(MonControl).IsAssignableFrom(value.GetType()) Then
Throw New ArgumentException("La Valeur doit être de type MonControl.", "value")
End If
End Sub

End Class



Ensuite, le CollectionEditor pour ma Collection
Public Class MonControlCollectionEditor
Inherits System.ComponentModel.Design.CollectionEditor

Public Sub New(ByVal newType As Type)
MyBase.new(newType)
End Sub

Protected Overrides Function CanSelectMultipleInstances() As Boolean
Return False
End Function

Protected Overrides Function CreateCollectionItemType() As Type
Return GetType(MonControl)
End Function

End Class



Et pour finir, la classe qui doit utiliser MonControl comme Items pour une collection.
Je vous le fais court, juste la propriété pour la collection:
Public Class TestCollectionProperties
Inherits System.Windows.Forms.ContainerControl

Private pCollectionMonControl As MonControlCollection
< _
SysCompModel.Editor(GetType(MonControlCollectionEditor), GetType(System.Drawing.Design.UITypeEditor)) _
        > _
Public Property CollectionMonControl() As MonControlCollection
Get
If Me.pCollectionMonControl Is Nothing Then Me.pCollectionMonControl  = New MonControlCollection()
Return Me.pCollectionMonControl
End Get
Set(value As MonControlCollection)
Me.pCollectionMonControl = value
End Set
End Property
End Class



Et maintenant le problème...

Quand je pose un object TestCollectionProperties dans ma Form tout va bien.
Je trouve bien mon éditeur de collection dans la grille de propriétés,
j'ajoute des items qui sont bien du type MonControl et tout va bien.

Par contre, quand je vais faire un tour dans le designer de ma Form voilà ce que je vois:

New MonControlCollection.Add(Me.MonControl1)


et bien sur ça ne marche pas...

Je m'étais attendu à trouver un truc du genre:

Me.TestCollectionProperties1.CollectionMonControl.Add(Me.MonControl1)


qui marche bien lui. Mais non ! A veux pas !

Quelqu'un aurait une idée ? siou plé...

6 réponses

cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 2
30 août 2009 à 10:03
Ok, problème résolu (je pense...)

En fait il est nécessaire d'ajouter aux attributs de la propriété CollectionMonControl la ligne suivante:

System.ComponentModel.SysCompModel.DesignerSerializationVisibility(SysCompModel.DesignerSerializationVisibility.Content)


La déclaration devient donc:

< _
System.ComponentModel.Editor(GetType(MonControlCollectionEditor), GetType(System.Drawing.Design.UITypeEditor)), _
System.ComponentModel.SysCompModel.DesignerSerializationVisibility(SysCompModel.DesignerSerializationVisibility.Content) _
> _
Public Property CollectionMonControl() As MonControlCollection
  (...)
End Property


A partir de ce moment, là où le concepteur écrivait New MonControlCollection.Add(Me.MonControl1)
dans la Sub InitializeComponent() du designer de la form, on obtient à présent:

Me.TestCollectionProperties1.CollectionMonControl.Add(Me.MonControl1)


------------------------------

Puisqu'on y est, il est plus judicieux d'ajouter une méthodes AddRange à la classe MonControlCollection,
qui gère la collection de la classe MonControl.

Du genre:
Public Sub AddRange(ByVal values() As MonControl)
For i As Integer = 0 To values.Length - 1
Me.List.Add(values(i))
Next i
End Sub


Ce qui donne, au moment de l'initialisation de la form par le designer, pour deux items à ajouter (par exemple):

Me.TestCollectionProperties1.CollectionMonControl.AddRange(New MonControl() {Me.MonControl1, Me.MonControl2})


Ce qui est plus concit dans le cas d'ajout de plusieurs items, qu'une ribembelle de Me.TestCollectionProperties1.CollectionMonControl.Add


Bon ben, après avoir trouvé la solution il va me falloir au moins une bonne petite semaine de repos...
Avec de la vitamine C et du poisson pour les neuronnes...

A bientôt.
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 août 2009 à 07:52
salut,

où est LIST ?
ajoute l'option strict et explicit dans les propriétés de ton projet, pour commencer

"a veux pas", tu as un message d'erreur? ou c'est juste que l'intellisense ne te propose pas ce que tu avais en tête?...

c'est ton code de bout en bout?

++
[hr]
0
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 2
30 août 2009 à 08:26
Bonjour,

Alors,


[quote= PCPT]où est LIST ?/quote
LIST est une propriété héritée de la classe CollectionBase
et contient les éléments ajoutés à la collection.
Il serait plus juste d'écrire:
MyBase.List... etc. ou bien Me.List... etc

[quote =PCPT]ajoute l'option strict et explicit dans les propriétés de ton projet, pour commencer/quote
C'est le cas. Je le fait par défaut.

[quote= PCPT]"a veux pas", tu as un message d'erreur? ou c'est juste que l'intellisense ne te propose pas ce que tu avais en tête?.../quote
Dans le cas présent c'est un message d'erreur "Syntaxe incorrecte", car le code
est généré automatiquement dans le designer de la form. Plus précisement dans la Sub InitializeComponent()

[quote =PCPT]c'est ton code de bout en bout?/quote
Oui et pour être complet, il y à une référence à l'Assembly "System.Design"
pour avoir la classe CollectionEditor
et un import:
Imports SysCompModel = System.ComponentModel


Donc la déclaration de la propriété:
< _
SysCompModel.Editor(GetType(MonControlCollectionEditor), GetType(System.Drawing.Design.UITypeEditor)) _
> _
Public Property CollectionMonControl() As MonControlCollection
  (...)
End Property


S'écrit en réalité:
< _
System.ComponentModel.Editor(GetType(MonControlCollectionEditor), GetType(System.Drawing.Design.UITypeEditor)) _
> _
Public Property CollectionMonControl() As MonControlCollection
  (...)
End Property


Voilà, merci pour ton message
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 août 2009 à 10:09
merci pour tes précisions

j'ai pu mettre en place ton code et observer le même problème

ton besoin est impérativement d'avoir la collection remplie dans le designer?

par code, çà fonctionne...

j'ai un usercontrol "moncontrol" (contenant juste une listbox)
j'ai ajouté la fonction count à MonControlCollection :
    Public Shadows Function Count() As Integer
        Return Me.List.Count
    End Function


un bouton :
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        Dim MonControl3 As New MonControl
        TestCollectionProperties1.CollectionMonControl.Add(MonControl3)
        TestCollectionProperties1.Controls.Add(MonControl3)
        MessageBox.Show(TestCollectionProperties1.CollectionMonControl.Count.ToString)
    End Sub



ce fonctionnement ne te conviendrait pas?


.....................
(dernier post lu)


ok ^^, tout est bien qui fini bien alors

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 2
30 août 2009 à 12:25
Merci d'avoir pris un peu de temps pour te pencher sur mon problème

En effet, j'aurai utilisé ta solution
0
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 2
30 août 2009 à 20:19
Je reviens sur le sujet juste pour dire que je n'ai pas trouvé la solution tout
seul bien sur.

Elle m'attendait sur le site d'Olivier Delmotte,
le tutoriel sur les Contrôles utilisateurs avancés

Merci à lui, c'est d'la bombe !
0
Rejoignez-nous