OVH Cloud OVH Cloud

Vrai ou Faux ???

27 réponses
Avatar
MrChris
Salut !

Je ne comprend plus...
J'ai une checkbox dans une template columns d'un datagrid.

Pour récupérer sa valeur je fait :
LeBool = CType(Datagrid1.Items(x).Cells(1).Controls(1), CheckBox).Checked
Puis j'aimerais bien que LeBool me renvoi 0 ou 1 à la place de True ou
False.

Donc je fait cint(LeBool) et la c'est le drame, quand c'est true il me
sort -1 !!!

Idem si je fait ctype(LeBool,Integer), de même si j'essaye avec double,
short, int16...

Pourquoi chez moi true = -1 !!!!!!!!!!!

Merci
MrChris

10 réponses

1 2 3
Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut

Essaye ça :

LeBool = iif(CType(Datagrid1.Items(x).Cells(1).Controls(1),
CheckBox).Checked,1,0)

@+

LJ


"MrChris" a écrit dans le message de
news:
Salut !

Je ne comprend plus...
J'ai une checkbox dans une template columns d'un datagrid.

Pour récupérer sa valeur je fait :
LeBool = CType(Datagrid1.Items(x).Cells(1).Controls(1), CheckBox).Checked
Puis j'aimerais bien que LeBool me renvoi 0 ou 1 à la place de True ou
False.

Donc je fait cint(LeBool) et la c'est le drame, quand c'est true il me
sort -1 !!!

Idem si je fait ctype(LeBool,Integer), de même si j'essaye avec double,
short, int16...

Pourquoi chez moi true = -1 !!!!!!!!!!!

Merci
MrChris




Avatar
Zazar
Bonjour,


Donc je fait cint(LeBool) et la c'est le drame, quand c'est true il me
sort -1 !!!



En basic et donc sous VB6, bool a la valeur -1 quand il est casté en int.
Dans le Framework.net, bool a la valeur 1.

Les concepteurs de VB.NET ont décidé que cint(true) renverrait -1 pour des
raisons de compatibilité avec VB6.
Pour rappel, cint n'est absolument pas une fonction/méthode .NET, c'est une
fonction VB.NET : lors de la compilation, elle est remplacée par du vraie
code .NET. Il ne faut plus utiliser cint, mais plutôt Convert.ToInt32() qui
sous VB.NET comme sous tous les autre langages renvoie 1 pour la valeur
true.

--
Zazar
Avatar
MrChris
Alors là je dis bravo !!!
Je savais que cint n'etait pas du vrai code ;)) ,
il me semblait que ctype oui par contre...

Maintenant il faut juste que les concepteurs arrêtent
de fumer et moi commencer à lire la doc...

Merci
MrChris
Avatar
Laurent Jordi \(www.ezlogic.mc\)
Salut

L'avantage du iif est que quelque soit la caleur de true, tu es sûr que ça
marche...

@+

LJ

"MrChris" a écrit dans le message de
news:
Alors là je dis bravo !!!
Je savais que cint n'etait pas du vrai code ;)) ,
il me semblait que ctype oui par contre...

Maintenant il faut juste que les concepteurs arrêtent
de fumer et moi commencer à lire la doc...

Merci
MrChris




Avatar
MrChris
Oui, et en plus je peux choisir moi même les valeurs que je veux pour true
et false...

Merci
MrChris
Avatar
Zazar
> L'avantage du iif est que quelque soit la caleur de true, tu es sûr que ça
marche...



Qu'est ce que vous entendez par là ?
Convert.ToInt32 fonctionne tout le temps.

--
Zazar
Avatar
Zazar
> Oui, et en plus je peux choisir moi même les valeurs que je veux pour true
et false...




Alors dans ce cas faîtes attention au iif. C'est acceptable de l'utiliser
pour renvoyer des constantes mais pas autre chose (et encore pas dans le cas
où la vitesse est vraiment critique).
Dans les autres situations, préfèrez lui un classique if then else endif.
(En fait, il faudrait le faire aussi dans le cas de constantes mais bon).

--
Zazar
Avatar
AlexC
iif ? ce n'ets pas une faut de frappe ?
c'est quoi la différence avec if ?
t'ain on en apprends tous les jours .. :)

"Zazar" a écrit dans le message
de news: #

> Oui, et en plus je peux choisir moi même les valeurs que je veux pour


true
> et false...
>

Alors dans ce cas faîtes attention au iif. C'est acceptable de l'utiliser
pour renvoyer des constantes mais pas autre chose (et encore pas dans le


cas
où la vitesse est vraiment critique).
Dans les autres situations, préfèrez lui un classique if then else endif.
(En fait, il faudrait le faire aussi dans le cas de constantes mais bon).

--
Zazar




Avatar
Patrice
Comment va être utilisée cette variable par la suite ?

Je ferais plutôt :
Dim LeBool As Boolean
LeBool = CType(Datagrid1.Items(x).Cells(1).Controls(1), CheckBox).Checked

Et plus loin

If LeBool Then
' Si vrai
Else
' Si faux
End If

de façon à ne pas utiliser la valeur sous-jacente utilisée pour coder
"vrai".

Initialement CInt(True) devait retourner 1 mais ceux ayant utilisé en VB la
valeur explicite -1 ont râlé et MS a fait marche arrière d'où la différence
entre 1 sous .NET et -1 avec les constructions spécifiques à VB (pour
"compatibilité" avec le code existant).

Patrice

--

"Zazar" a écrit dans le message
de news:
> L'avantage du iif est que quelque soit la caleur de true, tu es sûr que


ça
> marche...

Qu'est ce que vous entendez par là ?
Convert.ToInt32 fonctionne tout le temps.

--
Zazar




Avatar
Zazar
> iif ? ce n'ets pas une faut de frappe ?
c'est quoi la différence avec if ?



La syntaxe du iff c'est :
result = iif(expr1, expr2, expr3)

Si expr1 est évalué à true, alors result sera égal au résultat de
l'évaluation de expr2, sinon il sera égal à l'évaluation de expr3.
C'est à peu prés l'équivalent de :
result = expr1 ? expr2 : expr3 qui existe en C, java, c#, ...

Le problème du iff, c'est que expr2 et expr3 sont tout le temps évalué : ça
diminue les performances et ça peut entraîner des bugs. C'est équivalent à :
_res1 = expr1
_res2 = expr2
_res3 = expr3
if _res1 then
result = _res2
else
result = _res3
end if

Il vaut mieux lui préfèrer la syntaxe suivante :

if expr1 then
result = expr2
else
result = expr3
end if

--
Zazar
1 2 3