Formatage de string dans datalist

Signaler
Messages postés
90
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
10 mai 2010
-
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
-
Bonjour,

C'est du classique, mais je n'y arrive pas...
Je souhaite simplement limiter la longueur d'un label situé dans un datalist. Au-delà d'une certaine longueur je veux limiter la chaine et ajouter "..."
Voici ce que j'ai fait:

<

asp:Label
ID="PLabel"
runat="server"
Text='<%# IIf(Eval("PName").Length>4,Eval("PName").substring(0,4)&"...",Eval("PName")) %>
'
</asp:Label>

Le problème est que ça plante au niveau du Length si la chaine est nulle. (sinon ça marche sans pb).

Comment faire sans rajouter un iif pour vérifier la chaine nulle ? N'y-t-il pas une meilleure solution ?

Merci d'avance pour votre aide.

8 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Bonsoir

IIF((Eval("PName") & string.empty).length >4, "toto" , "tutu" ) ?

Fonctionnera sauf si Eval("PName") == DBNULL dans ce cas

IIF( PName = DBNull.value, "rien", IIF((Eval("PName") & string.empty).length >4, "toto" , "tutu" )  )

<hr />Cyril - MVS - MCP
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
J'oublie tu peux aussi passer par l'evenement databound de ton codebehind et récuperer le label grace au paramètre e de l'évenement


Label lbl = (Label)e.Item.FindControl("tonlabel");





<hr />
Cyril - MVS - MCP
Messages postés
90
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
10 mai 2010

Merci Cyril pour ton aide... mais je ne m'en sors toujours pas.


La nuit a porté conseil et je me suis rendu compte que le problème n'est pas au niveau lu length de la chaine (je m'excuse pour cette mauvaise analyse du problème)


En effet sauf erreur Eval("PName") marchera même si PName est DBNull, et le résultat sera un string.empty (par ailleurs un test sur PName==DBNull.value ne marche pas car PName n'est pas reconnu)

Bref j'ai quand même fait des modifs comme suit (le premier IIf me semble donc inutile désormais):

IIf(Eval("PName")=string.empty, "no",IIf((Eval("PName")& string.empty).length>10,Eval("PName").substring(0,9) & "...",Eval("PName")))


L'erreur est toujours la même : Index and length must refer to a location within the string.
Parameter name: length

En fait tout marche bien si j'enlève le substring. C'est ce que j'avais vu dès le début et c'est pourquoi je fais ce test sur la longueur.
Dans le cadre de mon test les chaines sont soit nulles, soit d'environ 15 à 30.

As-tu une idée ?

Peux-tu m'expliquer pourquoi tu rajoutes un string.empty pour évaluer la longueur ?

Merci d'avance.
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
salut,


ajouter string.empty fait que ta string n'est jamais nulle (null + "" = string non nulle), donc le length fonctionne

essaies

<%# IIf((Eval("PName") & String.Empty).Length>10, (Eval("PName") & String.Empty).substring(0,9) & "...", Eval("PName")) %>

si ca ne fonctionne pas essaies (par curiosité)

<%# IIf((Eval("PName") & String.Empty).Length>10, (Eval("PName") & String.Empty).substring(0,8) & "...", Eval("PName")) %>

yopyop
Messages postés
90
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
10 mai 2010

Merci pour ton aide Yopyop, mais ça ne marche pas même en allant jusqu'à (0,1).

J'ai enfin trouvé une solution qui fonctionne, mais je suis toujours curieux de comprendre pourquoi celle-ci ne marche pas.

Voici une solution:

<asp:Label
ID="PNameLabel"
runat="server"
Text='<%# FilterString(eval("PName"))%>
'
Width="100px"
Height="30px"
SkinID="LblSmall"></asp:Label>

Et un bout de code pour faire le boulot:
Protected

Function FilterString(
ByVal Toto
As
String)
As
String

Dim strBuilder =
New StringBuilder()strBuilder.Insert(0, Toto)

If (strBuilder.Length > 18)
Then

Return strBuilder.ToString().Substring(0, 18) &
"..."

Else

Return strBuilder.ToString()

End
If

End
Function

Ca permet de contourner l'obstacle, mais j'aurais aimé faire plus simple avec la première solution.

Encore merci, et tiens moi au courant si tu trouves quelque chose
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
personnellement,
je trouve que passer par une fonction est beaucoup plus propre...
et il serait encore plus propre de passer par l'événement ItemDatabound de la datagrid comme l'a suggéré jesus

yopyop
Messages postés
108
Date d'inscription
jeudi 2 juin 2005
Statut
Membre
Dernière intervention
10 mars 2011

salut

jai eu la solution anotre pbl mdemo sur le forum vois mon msg :

http://www.aspfr.com/infomsg.aspx?ID=784894


merci a ts les developpeurs...... c'est que du bonheur ce forum...on apprend ts les jrs !!!!

une simple fonction sql substring suffit a reglé notre pbl ......enjoy

> MaEl <
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
bein si tu veux une solution sql tu peux également utiliser


left(champs_nom,longueur)
et si tu veux tester si ta valeur est NULL tu utilise coalesce

SELECT COALESCE(left(champs,longueur),"CETTE VALEURE EST NULLE") from ....

yopyop