IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C#] Erreur comparaison de string


Sujet :

ASP.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 29
    Points
    29
    Par défaut [C#] Erreur comparaison de string
    Bonjour !
    J'ai un petit problème à cause d'une compraison de 2 string qui ne s'effectue pas (ou mal) voilà déjà mon bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    			i=0;
    			couleur = 0;
    			date_id = DataGrid1.Items[0].Cells[0].ToString();
    			date_sourc = date_id;
     
    			while (i<DataGrid1.Items.Count)
    			{	
     
    				while (date_id == date_sourc)
    				   {				                      			
    					if (couleur == 1)
    					  {
    						DataGrid1.Items[i].Cells[0].BackColor = System.Drawing.Color.Gray;
    					  }
    					else 
    					  { 
    						DataGrid1.Items[i].Cells[0].BackColor = System.Drawing.Color.Magenta;
    					  }
    					i++;
    					date_sourc = DataGrid1.Items[i].Cells[0].Text.ToString(); 
     
    				   }
     
    				if (couleur == 0)
    				  {
    					couleur=1;
    				  }
    				else
    				  {
    					couleur=0;
    				  }
    				date_id = date_sourc;
    			}
    Seulement il ne se rend jamais compte que mes deux string sont différent (alors qu'au bout d'un moment il le sont) et donc je ne sors pas de la première boucle et fatalement au bout d'un moment j'ai une erreur me disant que j'ai dépassé le nombre d'index...

    Quelqu'un peut-il maider ?
    Merci !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Points : 120
    Points
    120
    Par défaut
    Pour comparez les chaines, c'est string1.equals( string2)

  3. #3
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Essaye String.Compare

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 29
    Points
    29
    Par défaut
    la méthode string1.equals( string2) n'a rien résolu à mon problème

    Et puis pour le String.Compare d'après l'aide de VS2003 ca renvoi un entier ?
    Quel serait donc la syntaxe correcte pour mon cas, parce qu'apparament faut tout une batterie de paramètre

  5. #5
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (String.Compare(date_id, date_sourc) ==0)
    {
    }

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 29
    Points
    29
    Par défaut
    rah ! Apparament mon problème ne vient pas de là puisque j'ai toujours l'erreur:
    L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection. Nom du paramètre : index
    sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_sourc = DataGrid1.Items[i].Cells[0].Text.ToString();
    Qu'est-ce que ca peut etre à ton avis ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Points : 120
    Points
    120
    Par défaut
    Ta variable i est incrementée dans la boucle while (date_id == date_sourc) donc i peut être un index trop élevé. Essai en rajoutant un test dans ton while

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while ( date_id.equals(date_sourc))  &&  i<DataGrid1.Items.Count )

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 29
    Points
    29
    Par défaut
    J'ai déjà essayé mais ca marche pas !
    De mon coté j'ai effectué un pitit test qui prend les lignes 1 par 1 et lorsque la date change ca doit afficher un message...seulement le message ne s'affiche pas !
    C'est pour ca je ne vois vraiment pas d'ou vien l'erreur, je suis complétement embrouillé !

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par Damsou
    rah ! Apparament mon problème ne vient pas de là puisque j'ai toujours l'erreur:
    L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection. Nom du paramètre : index
    sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_sourc = DataGrid1.Items[i].Cells[0].Text.ToString();
    Qu'est-ce que ca peut etre à ton avis ?
    Essaye:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while (i<DataGrid1.Items.Count - 1)

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 29
    Points
    29
    Par défaut
    J'y avais pensé mais non ce n'est pas ca !!
    Est-ce que je n'ai pas oublié de passez une valeur dans une de mes date et donc ca chamboule tout ?
    Je continue à tester de mon coté mais je vois vraiment pas

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 29
    Points
    29
    Par défaut
    J'ai du nouveau !!!
    Après de multiple tentative en tout genre j'ai tenté de mettre un while (i<(DataGrid1.Items.Count - 2)) et ca marche presque sauf que y a juste les deux dernière ligne de mon datagird qui ne sont pas colorié ! logique en meme temps ! mais si je ne mais juste while (i<DataGrid1.Items.Count) ca dépasse le nombre d'index ! donc j'ai une erreur dans mon algo mais j'arrive pas à la regler je remet mon code et si quelqu'un pouvait me guider...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    i=0;
    			couleur = 0;
    			date_id = DataGrid1.Items[0].Cells[0].Text.ToString();
    			date_sourc = date_id;
     
    			while (i<(DataGrid1.Items.Count - 2)) 
    			{	
    				while (date_sourc.CompareTo(date_id) == 0)
    				{				                      			
    					if (couleur == 1)
    					{
    						DataGrid1.Items[i].Cells[0].BackColor = System.Drawing.Color.Gray;
    					}
    					else 
    					{ 
    						DataGrid1.Items[i].Cells[0].BackColor = System.Drawing.Color.Magenta;
    					}
     
    					i++;					
    					date_sourc = DataGrid1.Items[i].Cells[0].Text.ToString(); 						
    				}				
     
    				if (couleur == 0)
    				  {
    					couleur=1;
    				  }
    				else
    				  {
    					couleur=0;
    				  }				
     
    				date_id = date_sourc;
    			}
    Merci

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int couleur = 1;
    string date_sourc = null;
     
    for ( int i = 0 ; i < DataGrid1.Items.Count ; ++i )
    {
      TableCell cell = DataGrid1.Items[i].Cells[0];
     
      if ( cell.Text != date_sourc )
      {
        couleur = 1 - couleur;
        date_sourc = cell.Text;
      }
     
      cell.BackColor = ( couleur == 0 ? Color.Magenta : Color.Gray );
    }
    Une boucle qui incrémente le compteur de la boucle autour, c'est pas une bonne idée. Dans ton cas, elle l'incrémentait systématiquement au-delà du nombre d'éléments une fois arrivée à la dernière série de valeurs identiques (qu'il y en ait une ou plusieurs).
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 29
    Points
    29
    Par défaut
    Oh !! Ca marche !! Merci beaucoup !!!
    Mais pourrait tu m'expliquer un tout ptit peu tout ca ! parce que j'ai compris en gros mais pas en détails !
    Merci !
    Ah oui ! et disons que je souhaite colorier toute la ligne directement y a un moyen ou il faut que je colorie chaque cellule de la ligne une par une ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par Damsou
    Mais pourrait tu m'expliquer un tout ptit peu tout ca ! parce que j'ai compris en gros mais pas en détails !
    Données : a, a, a, b, b, c, d, d, d, e, e, f, f, f
    Tes deux boucles marchent bien jusqu'à e.
    La boucle principale commence sur la position du premier f.
    La boucle secondaire avance jusqu'à trouver une valeur différente de f. Mais vu que ça ne bouge plus jusqu'à la fin de la liste et qu'il n'y a pas de test pour contrôler ça, ça finit fatalement par sortir des limites -> kaboom.

    Y aurait moyen de faire marcher ça en ajoutant le test correspondant, mais vu qu'il y a plus simple pour faire pareil, pourquoi se priver :)

    Et donc la version 'for' :
    - tu fixes des valeurs par défaut pour la couleur et la chaîne avec laquelle tu compares
    - à chaque itération, si la chaîne change, tu inverses la couleur (1-couleur est le petit trucage habituel pour alterner entre 0 et 1 sans devoir faire de test) et tu stockes la nouvelle chaîne de comparaison.
    - tu colles la couleur correspondant à la valeur actuelle de la variable.

    Les valeurs initiales sont choisies pour que la première itération enclenche directement le traitement, sans avoir à faire de cas particulier. Sinon tu devrais récupérer le texte du premier élément et boucler à partir du deuxième. Ça marcherait aussi, sauf que dans ce cas il faudrait contrôler qu'il y a des éléments avant de faire la boucle.
    Là il n'y a aucun cas particulier, ça marche quel que soit le nombre d'éléments et il n'y a pas de code en double.

    Citation Envoyé par Damsou
    Ah oui ! et disons que je souhaite colorier toute la ligne directement y a un moyen ou il faut que je colorie chaque cellule de la ligne une par une ?
    Tu peux faire du CSS. Tu fixes une classe pour l'élément TableRow et dans la feuille de style tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tr.taclasse td
    {
      background-color : #abcdef;
    }
    Au lieu de faire varier la couleur dans la boucle, tu fais varier le nom de la classe.
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb de comparaison de string
    Par Kpone dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2006, 23h31
  2. [LG] Comparaison de strings
    Par Pack_of_the_Night dans le forum Langage
    Réponses: 2
    Dernier message: 09/02/2006, 20h58
  3. Réponses: 1
    Dernier message: 24/12/2005, 14h18
  4. [debutant]erreur int to string alors qu il n y a pas de int
    Par Battosaiii dans le forum SL & STL
    Réponses: 1
    Dernier message: 06/11/2005, 15h10
  5. Erreur compilation avec <string>
    Par seal3 dans le forum SL & STL
    Réponses: 9
    Dernier message: 25/08/2005, 20h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo