OVH Cloud OVH Cloud

Problème de tri des colonnes d'une ListView

7 réponses
Avatar
LEBRUN Thomas
Bonjour à tous :)

Je suis confronté à un prooblème qui concerne le tri des colonnes d'une
listview.

Cette listview est alimenté par une comboBox. Lorsque je change d'index sur
la combo et que je reviens dessus par la suite, j'ai droit à l'exception :

Une exception non gérée du type 'System.ArgumentOutOfRangeException' s'est
produite dans system.windows.forms.dll

Informations supplémentaires : L'argument spécifié n'était pas dans les
limites de la plage des valeurs valides.

J'utilise la technique que l'on trouve ici :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwinforms/html/listviewsort.asp

mais l'erreur survient à chaque fois sur cette ligne :

return String.Compare(((ListViewItem)x).SubItems[col].Text,
((ListViewItem)y).SubItems[col].Text);

(ou l'autre suivant l'ordre dans lequel on tri)

J'avoue que je planche depuis un bon moment sans rien trouver....

Une idée ?

Merci
--
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9

7 réponses

Avatar
Mitsuru FURUTA [Ms]
Bonjour,

Le code du tri sur la listview fonctionne bien dans un cas isolé, cela doit
venir de ton contexte.
Dis nous en un peu plus sur le code de ton combo.

A plus,

Mitsuru FURUTA [Microsoft FRANCE]

"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> wrote in message
news:
Bonjour à tous :)

Je suis confronté à un prooblème qui concerne le tri des colonnes d'une
listview.

Cette listview est alimenté par une comboBox. Lorsque je change d'index


sur
la combo et que je reviens dessus par la suite, j'ai droit à l'exception :

Une exception non gérée du type 'System.ArgumentOutOfRangeException' s'est
produite dans system.windows.forms.dll

Informations supplémentaires : L'argument spécifié n'était pas dans les
limites de la plage des valeurs valides.

J'utilise la technique que l'on trouve ici :



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwinforms/html/listviewsort.asp

mais l'erreur survient à chaque fois sur cette ligne :

return String.Compare(((ListViewItem)x).SubItems[col].Text,
((ListViewItem)y).SubItems[col].Text);

(ou l'autre suivant l'ordre dans lequel on tri)

J'avoue que je planche depuis un bon moment sans rien trouver....

Une idée ?

Merci
--
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9


Avatar
LEBRUN Thomas
Bonjou,

Ma combo est une simple combobBox alimenté de cette facon:

foreach( string region in ParseurOrdres.Regions )
{
if ( !cbRegion.Items.Contains(region) )
{
cbRegion.Items.Add(region);
}
}

ParseurOrdres.Regions est en fait une ArrayList : donc, rien de bien
particulier: je ne fais que tester, pour chaque élément de l'arraylist, si
l'element est dajà dans la combo : si oui, je ne fais rien, sinon, j'ajoute
un item avec cet élément.

C'est pourquoi je ne comprend vraiment pas d'où peut venir le problème....

Merci

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9

"Mitsuru FURUTA [Ms]" a écrit :

Bonjour,

Le code du tri sur la listview fonctionne bien dans un cas isolé, cela doit
venir de ton contexte.
Dis nous en un peu plus sur le code de ton combo.

A plus,

Mitsuru FURUTA [Microsoft FRANCE]

"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> wrote in message
news:
> Bonjour à tous :)
>
> Je suis confronté à un prooblème qui concerne le tri des colonnes d'une
> listview.
>
> Cette listview est alimenté par une comboBox. Lorsque je change d'index
sur
> la combo et que je reviens dessus par la suite, j'ai droit à l'exception :
>
> Une exception non gérée du type 'System.ArgumentOutOfRangeException' s'est
> produite dans system.windows.forms.dll
>
> Informations supplémentaires : L'argument spécifié n'était pas dans les
> limites de la plage des valeurs valides.
>
> J'utilise la technique que l'on trouve ici :
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwinforms/html/listviewsort.asp
>
> mais l'erreur survient à chaque fois sur cette ligne :
>
> return String.Compare(((ListViewItem)x).SubItems[col].Text,
> ((ListViewItem)y).SubItems[col].Text);
>
> (ou l'autre suivant l'ordre dans lequel on tri)
>
> J'avoue que je planche depuis un bon moment sans rien trouver....
>
> Une idée ?
>
> Merci
> --
> LEBRUN Thomas
> http://morpheus.developpez.com
> http://blog.developpez.com/index.php?blog=9





Avatar
Simon Mourier [MS]
Vu l'erreur "ArgumentOutOfRangeException", il semblererait que 'SubItems' ne
contiennent pas d'éléments 'col'.

Simon.


"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> a écrit dans le message de
news:
Bonjou,

Ma combo est une simple combobBox alimenté de cette facon:

foreach( string region in ParseurOrdres.Regions )
{
if ( !cbRegion.Items.Contains(region) )
{
cbRegion.Items.Add(region);
}
}

ParseurOrdres.Regions est en fait une ArrayList : donc, rien de bien
particulier: je ne fais que tester, pour chaque élément de l'arraylist, si
l'element est dajà dans la combo : si oui, je ne fais rien, sinon,
j'ajoute
un item avec cet élément.

C'est pourquoi je ne comprend vraiment pas d'où peut venir le problème....

Merci

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9

"Mitsuru FURUTA [Ms]" a écrit :

Bonjour,

Le code du tri sur la listview fonctionne bien dans un cas isolé, cela
doit
venir de ton contexte.
Dis nous en un peu plus sur le code de ton combo.

A plus,

Mitsuru FURUTA [Microsoft FRANCE]

"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> wrote in message
news:
> Bonjour à tous :)
>
> Je suis confronté à un prooblème qui concerne le tri des colonnes d'une
> listview.
>
> Cette listview est alimenté par une comboBox. Lorsque je change d'index
sur
> la combo et que je reviens dessus par la suite, j'ai droit à
> l'exception :
>
> Une exception non gérée du type 'System.ArgumentOutOfRangeException'
> s'est
> produite dans system.windows.forms.dll
>
> Informations supplémentaires : L'argument spécifié n'était pas dans les
> limites de la plage des valeurs valides.
>
> J'utilise la technique que l'on trouve ici :
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwinforms/html/listviewsort.asp
>
> mais l'erreur survient à chaque fois sur cette ligne :
>
> return String.Compare(((ListViewItem)x).SubItems[col].Text,
> ((ListViewItem)y).SubItems[col].Text);
>
> (ou l'autre suivant l'ordre dans lequel on tri)
>
> J'avoue que je planche depuis un bon moment sans rien trouver....
>
> Une idée ?
>
> Merci
> --
> LEBRUN Thomas
> http://morpheus.developpez.com
> http://blog.developpez.com/index.php?blog=9







Avatar
LEBRUN Thomas
Oui, c'est ce que je me suis dit aussi :)

En fisant un peu de debug, je me suis apercu de 2 choses très bizarre :
- la première, c'est que si je fais un tri sur la toute première colonne,
que je change d'item dans ma combo et que je reviens sur l'item précédent, ma
listview se vide de tous ses éléments (et de ses sous-items), sauf pour la
premiere ligne....
Je vois vraiment pas pourquoi.....

- La deuxième choses que j'ai remarqué, c'est que à chaque changement d'item
de la combo, l'evenement ListView_Click est déclenché, alors qu'il n'a aucune
rison de l'être puisque je ne clic pas sur la listView, je ne fais que jouer
avec la combo...

Peut-être est-ce du au fait que la première colonne de ma listView a des
checkbox ?

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9

"Simon Mourier [MS]" a écrit :

Vu l'erreur "ArgumentOutOfRangeException", il semblererait que 'SubItems' ne
contiennent pas d'éléments 'col'.

Simon.


"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> a écrit dans le message de
news:
> Bonjou,
>
> Ma combo est une simple combobBox alimenté de cette facon:
>
> foreach( string region in ParseurOrdres.Regions )
> {
> if ( !cbRegion.Items.Contains(region) )
> {
> cbRegion.Items.Add(region);
> }
> }
>
> ParseurOrdres.Regions est en fait une ArrayList : donc, rien de bien
> particulier: je ne fais que tester, pour chaque élément de l'arraylist, si
> l'element est dajà dans la combo : si oui, je ne fais rien, sinon,
> j'ajoute
> un item avec cet élément.
>
> C'est pourquoi je ne comprend vraiment pas d'où peut venir le problème....
>
> Merci
>
> -------------------
> LEBRUN Thomas
> http://morpheus.developpez.com
> http://blog.developpez.com/index.php?blog=9
>
> "Mitsuru FURUTA [Ms]" a écrit :
>
>> Bonjour,
>>
>> Le code du tri sur la listview fonctionne bien dans un cas isolé, cela
>> doit
>> venir de ton contexte.
>> Dis nous en un peu plus sur le code de ton combo.
>>
>> A plus,
>>
>> Mitsuru FURUTA [Microsoft FRANCE]
>>
>> "LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> wrote in message
>> news:
>> > Bonjour à tous :)
>> >
>> > Je suis confronté à un prooblème qui concerne le tri des colonnes d'une
>> > listview.
>> >
>> > Cette listview est alimenté par une comboBox. Lorsque je change d'index
>> sur
>> > la combo et que je reviens dessus par la suite, j'ai droit à
>> > l'exception :
>> >
>> > Une exception non gérée du type 'System.ArgumentOutOfRangeException'
>> > s'est
>> > produite dans system.windows.forms.dll
>> >
>> > Informations supplémentaires : L'argument spécifié n'était pas dans les
>> > limites de la plage des valeurs valides.
>> >
>> > J'utilise la technique que l'on trouve ici :
>> >
>> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwinforms/html/listviewsort.asp
>> >
>> > mais l'erreur survient à chaque fois sur cette ligne :
>> >
>> > return String.Compare(((ListViewItem)x).SubItems[col].Text,
>> > ((ListViewItem)y).SubItems[col].Text);
>> >
>> > (ou l'autre suivant l'ordre dans lequel on tri)
>> >
>> > J'avoue que je planche depuis un bon moment sans rien trouver....
>> >
>> > Une idée ?
>> >
>> > Merci
>> > --
>> > LEBRUN Thomas
>> > http://morpheus.developpez.com
>> > http://blog.developpez.com/index.php?blog=9
>>
>>
>>





Avatar
Zoury
Salut Thomas! :O)

Tu sembles pris au beau milieu d'un cirque d'événements qui se déclenche les
uns après les autres. Je suis le premier à affirner que ce n'est pas
toujours évident de découvrir ce qui se passe quand ça arrive.. Comme tu le
sais sûrement, parfois des événements se déclenche sans qu'on l'veuille
réellement...

ex :
'***
Public Class Form1
Inherits Form

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' cette ligne de code déclenche l'événement ci-dessous..
ComboBox1.DataSource = New String() {"item 1", "item 2", "item 3"}
End Sub

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal
e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Console.WriteLine("ComboBox1_SelectedIndexChanged")
End Sub

End Class
'***

Je te conseillerais donc de mettre des points d'arrêt sur (tous) les
événements de ton formulaire et d'observer attentivement la pile d'appels au
fur et à mesure que tu avances dans le code en pas à pas. Tu peux même
mettre tout le code de ces événements en commentaire et décommenter au fur à
mesure que tu tests. Ainsi tu est sûr que si ça commence à buggué, c'est à
cause de la dernière modif effectué soit le code que tu vient de
décommentariser.

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
LEBRUN Thomas
Après avoir essayé plusieurs trucs, j'ai réussit, avec l'ide d'un membre du
forum de developpez.com, à trouver une solution à mon probleme :)

Je remercie quand même tout le monde de s'être penché sur mon problème :p

Car c'est vrai que je trouve bizarre que des evenements se déclenche un peu
n'importe quand.....

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9

"Zoury" a écrit :

Salut Thomas! :O)

Tu sembles pris au beau milieu d'un cirque d'événements qui se déclenche les
uns après les autres. Je suis le premier à affirner que ce n'est pas
toujours évident de découvrir ce qui se passe quand ça arrive.. Comme tu le
sais sûrement, parfois des événements se déclenche sans qu'on l'veuille
réellement...

ex :
'***
Public Class Form1
Inherits Form

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
' cette ligne de code déclenche l'événement ci-dessous..
ComboBox1.DataSource = New String() {"item 1", "item 2", "item 3"}
End Sub

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal
e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Console.WriteLine("ComboBox1_SelectedIndexChanged")
End Sub

End Class
'***

Je te conseillerais donc de mettre des points d'arrêt sur (tous) les
événements de ton formulaire et d'observer attentivement la pile d'appels au
fur et à mesure que tu avances dans le code en pas à pas. Tu peux même
mettre tout le code de ces événements en commentaire et décommenter au fur à
mesure que tu tests. Ainsi tu est sûr que si ça commence à buggué, c'est à
cause de la dernière modif effectué soit le code que tu vient de
décommentariser.

--
Cordialement
Yanick
MVP pour Visual Basic





Avatar
Mitsuru FURUTA [Ms]
Bonjour à tous,

Il est vrai que parfois les évènements liés au Binding se déclenchent
intempestivement. Mais tout à une raison (sauf bug :-)).
Juste un conseil, si vous devez jouer finement avec ce genre d'évènements,
passez par le currencyManager, c'est beaucoup plus fiable que par les
contrôles.

Exemple: ((CurrencyManager) BindingContext[source, "datamember"]), fournit
des évènements directement sur la source de données (PositionChanged par
exemple), c'est lui qui détient le curseur et qui est à l'origine des
évènements.
Fonctionnalités très intéressantes également: pouvoir momentanément
débrancher les évènements de databinding liés à une source de données:
SuspendBinding() et ResumeBinding().

A plus et bonne journée à tous,

Mitsuru FURUTA [Microsoft FRANCE]

"LEBRUN Thomas" <lebrun_thomas_at_hotmail.com> wrote in message
news:
Après avoir essayé plusieurs trucs, j'ai réussit, avec l'ide d'un membre


du
forum de developpez.com, à trouver une solution à mon probleme :)

Je remercie quand même tout le monde de s'être penché sur mon problème :p

Car c'est vrai que je trouve bizarre que des evenements se déclenche un


peu
n'importe quand.....

A+

-------------------
LEBRUN Thomas
http://morpheus.developpez.com
http://blog.developpez.com/index.php?blog=9

"Zoury" a écrit :

> Salut Thomas! :O)
>
> Tu sembles pris au beau milieu d'un cirque d'événements qui se déclenche


les
> uns après les autres. Je suis le premier à affirner que ce n'est pas
> toujours évident de découvrir ce qui se passe quand ça arrive.. Comme tu


le
> sais sûrement, parfois des événements se déclenche sans qu'on l'veuille
> réellement...
>
> ex :
> '***
> Public Class Form1
> Inherits Form
>
> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
> System.EventArgs) Handles MyBase.Load
> ' cette ligne de code déclenche l'événement ci-dessous..
> ComboBox1.DataSource = New String() {"item 1", "item 2", "item


3"}
> End Sub
>
> Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object,


ByVal
> e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
> Console.WriteLine("ComboBox1_SelectedIndexChanged")
> End Sub
>
> End Class
> '***
>
> Je te conseillerais donc de mettre des points d'arrêt sur (tous) les
> événements de ton formulaire et d'observer attentivement la pile


d'appels au
> fur et à mesure que tu avances dans le code en pas à pas. Tu peux même
> mettre tout le code de ces événements en commentaire et décommenter au


fur à
> mesure que tu tests. Ainsi tu est sûr que si ça commence à buggué, c'est


à
> cause de la dernière modif effectué soit le code que tu vient de
> décommentariser.
>
> --
> Cordialement
> Yanick
> MVP pour Visual Basic
>
>
>