Substring [Résolu]

Signaler
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010
-
 nhervagault -
Bonjour,
j'ai un gridview et j'affiche des mail sur la colonne5 par exemple.
Comment je peux lui dire d'afficher que le texte à droite de @ des lignes de toute la colonne?
Merci d'avance.

21 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
@Bidou
"Non c'est pas une bonne solution (même assez mauvaise), car si y'a pas de @ c'est le crash assuré."
=> C'est évident qu'avec mon code, il faut faire des vérifications. Je cherchais juste à donner une réponse rapide et viable, qu'il pouvait facilement tester.
Mais d'un autre côté, dans ton 1er code, si myString est null, c'est également le crash assuré. Tu considère juste qu'il a vérifié que son string n'était pas null, comme moi j'ai considéré que son string avait le format d'une adresse email.


Mais sinon,

string s = e.Row.Cells[4].Text;

string[] tab = s.Split('@');

e.Row.Cells[4].Text = tab[tab.Length-1];

marche aussi.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

Au fait j'ai fait un truc du style:
 if (e.Row.RowType == DataControlRowType.DataRow)
            {
                          e.Row.Cells[5].Text = e.Row.Cells[5].Text.Substring(e.Row.Cells[5].Text.IndexOf("@") + 1);

            }
 
Mais ça ne change rien, si vous pouvez m'aider
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Salut

Tu peux essayer d'utiliser la méthode Split() de la classe string, qui te "coupe" ton string en tableau de strings (en effaçant le caractère de séparation)
> e.Row.Cells[5].Text e.Row.Cells[5].Text.Split('@')[1];

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

J'ai essayé mais ça ne marche pas.
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

J'ai aussi entendu dire que le Split utilisé directement comme ça peut faire exploser... s'il ne trouve pas de @.Apparemment il vaut mieux utiliser une variable avant .
Pouvez-vous me dire comment faire?
Merci.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Salut,
Tu peux faire comme ça par exemple:

string s = myString.Substring(0, myString.IndexOfOrDefault(
"@", myString.Length));

public
static
class
Extension
{
  
public
static
int IndexOfOrDefault(
this
string text,
string value,
int def)
   {
     
int index = text.IndexOf(value);
     
return index > -1 ? index : def;
   }
}

<hr />
-Blog-
-Site Perso-
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

Et comment je peux adapter, le code que tu m'as donné (Bidou) par rapport à ce que j'ai?:
e.Row.Cells[4].Text = e.Row.Cells[4].Text.Split('@')[1];
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
string s =  e.Row.Cells[4].Text;
e.Row.Cells[4].Text = s.Substring(0, s.IndexOfOrDefault("@"
, s.Length));

<hr />
-Blog-
-Site Perso-
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

IndexOfOrDefault n'existe pas, j'ai essayé comme suit mais ça affiche toujours tout, ça n'affiche pas juste ce qui est après @:
 protected void GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
        {
          
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string s = e.Row.Cells[4].Text;
                e.Row.Cells[4].Text = s.Substring(0, s.IndexOf("@", s.Length));
            }
        }
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Le code que je t'ai donné est correct tu as oublié de copier/coller la deuxième partie du code que je t'ai donné!

public static class Extension...

<hr />
-Blog-
-Site Perso-
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

O fait j'ai fait comme suit mais il ne voit pas IndexOfDefault:
public static class Extension
        {
            public int IndexOfOrDefault(this string text, string value, int def)
            {
                int index = text.IndexOf(value);
                return index > -1 ? index : def;
            }
        }
    protected void GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
        {
          
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
          
                string s = e.Row.Cells[4].Text;
                e.Row.Cells[4].Text = s.Substring(0, s.IndexOfOrDefault("@", s.Length));
     
            }

        }
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

Quand je fais du pas à pas j'ai bienle texte après le @ mais au moment de l'affichage du gridview, il ne l'affiche pas. Peut etre qu'il y a quelque  chose qui m'échappe ou j'ai mal utilisé le gridview_rowdatabound? Je dois faire un truc dans le load?
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

Autant pour moi, ça marche avec ça:
string s = e.Row.Cells[4].Text;
            e.Row.Cells[4].Text = s.Split('@')[1];

Merci de votre aide.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Non c'est pas une bonne solution (même assez mauvaise), car si y'a pas de @ c'est le crash assuré.
Réessaye avec le code que je t'ai donné... un peu de persévérance bon sang !

<hr />
-Blog-
-Site Perso-
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

Sisi, j'ai bien mis ce que tu m'as donné mais au niveau du GridView1_RowDataBound, il ne reconnait pas IndexOfOrDefault. C'est pour ça que je ne l'ai pas utilisé à moins que tu vois pourquoi il ne le reconnait pas?
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
@ddove53 : IndexOrDefault doit être statique !
public static int IndexOfOrDefault(this string text, string value, int def)
{
    // blablabla
}

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

J'ai bien mis le static mais je ne sais pas pourquoi il le reconnait pas dans GridView1_RowDataBound
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Oui tu as raison, on devrait aussi faire un test pour voir si c'est null !
Cependant, c'est quand même un peu différent: une fois on a une valeur null (donc une valeur spécialement remplie) alors que dans l'autre cas, c'est une string comme une autre, sauf qu'elle n'a pa de "@". Il suffit qu'un gus ait mal introduit son mail et c'est cuit.

Ca n'empêche pas que mon code manquait de rigueur.
Et puis les Extensions Methods, c'est quelque chose que j'apprécie moyennement...

<hr />
-Blog-
-Site Perso-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
"Ca n'empêche pas que mon code manquait de rigueur."
=> De toutes façons, on sait qu'il ne faut pas accéder aux méthodes / propriétés d'un objet null. On sait qu'il ne faut pas dépasser la limite d'un tableau. On sait qu'il ne faut pas diviser par 0...
A quoi bon le préciser à chaque fois ? Et d'un autre côté, si la personne au contraire ne le sait pas, ça lui permettra de l'apprendre.

De toutes façons, 99% des codes que l'on fournit ne sont pas parfaitement blindés. Mais comme le précise le règlement, on n'est pas là pour faire le boulot des autres à leur place, on est juste là pour les aider. Si quelqu'un demande comment blinder son code, on cherchera à la blinder au max. Mais je ne trouve pas qu'il soit utile de blinder absolument tout code qu'on donne.

Si ça se trouve, son code se trouve dans un bloc if du genre
if(str != null && str.Contains('@'))
et si ce n'est pas le cas, il rajoutera ça le jour où il rencontrera une erreur.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
623
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
15 juin 2010

Effectivement, je l'ai fait dans un bloc de test If mais je ne l'avais pas précisé en posant une question.