7 votes

Pourquoi ce code fonctionne-t-il sous Windows 7, mais pas sous Windows XP ?

Un peu de contexte : Je suis un converti de WPF à WinForms et depuis quelque temps je suis en train de migrer mon application.

Un ami m'a signalé que mon code ne fonctionne pas sous Windows XP (il génère un débordement de pile au démarrage) alors qu'il fonctionne parfaitement sous Windows 7 (sous lequel je développe).

Après une petite recherche, la cause du problème était quelque chose de ce genre :

 private void listView1_SelectedIndexChanged(object sender, EventArgs e)
 {
     listView1.SelectedIndices.Clear();
     listView1.Items[0].Selected = true;
 }

Maintenant que j'ai remarqué cette mauvaise décision évidente, je ne me demandais pas pourquoi il ne fonctionne pas sous Windows XP. Je me demandais pourquoi cela fonctionne-t-il sur Windows 7 .

Il est évident qu'à un moment donné, le compilateur comprendra ce que j'essaie de faire et empêchera le même événement d'être déclenché encore et encore, mais Je préférerais qu'il ne fasse rien, afin que je puisse voir et éliminer le bogue à vue sur la plateforme sur laquelle je développe, plutôt que de devoir le tester sur deux plateformes simultanément. Dans WPF, je pouvais gérer ce type de comportement manuellement en donnant à e.Handled la valeur 'true', mais dans WinForms, cela n'existe apparemment pas.

Existe-t-il une sorte d'indicateur de compilation pour cela ?

4voto

Lloyd Points 16334

Essayez ça :

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
   if (!listView1.Items[0].Selected) {
       listView1.SelectedIndices.Clear();
       listView1.Items[0].Selected = true;
   }
}

Vous ne voulez régler la sélection qu'UNE SEULE FOIS, sur votre premier élément. Le problème, c'est que ça risque de devenir une boucle perpétuelle.

Quant à savoir pourquoi Windows 7 est plus indulgent que XP, je ne saurais le dire. Cela pourrait être dû à l'ordre dans lequel les messages LVM_* sont traités ou autre.

2voto

BryanJ Points 4715

Vérifiez si la version de .NET fait une différence. Si la version de .NET de votre machine Windows 7 est plus récente que celle de XP (ce qui est très probable), il est possible qu'il y ait des différences même si vous ciblez la version antérieure.

Voir ce que MSDN dit à propos de la rétrocompatibilité de .NET .

1voto

EaterOfCode Points 1237

Ceci peut fonctionner (NON TESTÉ)

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
   if(Environment.OSVersion.Version.Major < 6) listview1.SelectedIndexChanged -= new EventHandler(listView1_SelectedIndexChanged);
   listView1.SelectedIndices.Clear();
   listView1.Items[0].Selected = true;
   if(Environment.OSVersion.Version.Major < 6) listview1.SelectedIndexChanged += new EventHandler(listView1_SelectedIndexChanged);
}

éditer regarder son OS spécifique :o

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X