Formatage de string dans datalist

mdemo Messages postés 90 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 10 mai 2010 - 24 juil. 2006 à 23:05
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 - 27 juil. 2006 à 11:09
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

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
24 juil. 2006 à 23:51
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
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
24 juil. 2006 à 23:53
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
0
mdemo Messages postés 90 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 10 mai 2010
25 juil. 2006 à 10:25
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.
0
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
26 juil. 2006 à 10:42
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mdemo Messages postés 90 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 10 mai 2010
26 juil. 2006 à 22:55
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
0
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
27 juil. 2006 à 01:06
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
0
cs_mael974 Messages postés 108 Date d'inscription jeudi 2 juin 2005 Statut Membre Dernière intervention 10 mars 2011
27 juil. 2006 à 10:29
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 <
0
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
27 juil. 2006 à 11:09
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
0
Rejoignez-nous