Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Question de débutant

5 réponses
Avatar
Faust
bonjour,

je suis en train (d'essayer) de monter un site avec le framework 3.5
j'ai un cas d'utilisation de mon site que je n'arrive pas à mettre au
point (enfin, j'ai réussi à faire quelque chose mais ça ne marche pas
tout à fait comme je veux)

voilà la chose (c'est un peu long à expliquer, vous affolez pas :) ):

sur une page, j'ai un textbox, un bouton et un gridview

le gridview est associé à un objectdatasource
qui lui est associé à la classe suivante:

public class TransfertDatasource
{
public TransfertDatasource()
{
}

// ListeTransfert = List<Transfert>
public static IEnumerable GetTransferts(ListeTransfert
listeTransfert)
{
return listeTransfert == null ? null : listeTransfert.ToList();
}
}

l'event Click du bouton ajoute des objets de type Transfert à la liste
qui est utilisée par l'objectdatasource en fonction du contenu du
textbox
l'event Change du textbox est connecté sur la même procédure

le pourquoi de la chose c'est que je voudrais que la saisie dans le
textbox puisse se faire de deux manières:
- traditionnelement à la main (avec click sur le bouton pour ajouter la
donnée)
ou
- avec un lecteur de code barre qui ajoute en fin de scan une
simulation de l'appui de la touche entrée (donc sans cliquer sur le
bouton)

mon soucis est le suivant: quand je saisi au lecteur de code barre tout
marche impécablement et mon gridview m'affiche bien la nouvelle ligne
par contre, quand je rajoute par le bouton, mon code rajoute bien un et
un seul objet à la liste, mais l'event est appelé 2 fois (j'imagine une
fois pour la Change et une fois par le Click). J'ai résolu le double
ajout en testant le contenu du textbox en début de procédure et en
remettant le textbox à string.Empty à la fin de la procédure: ça marche
bien
par contre, j'ai bel et bien 2 appels au GetTransferts de ma classe
TransfertDatasource ce qui fait que le gridview affiche 2 lignes de
plus (alors que j'ai bien qu'un objet en plus) au lieu d'une seule

valàvalà, donc ma question est double:
- est-ce que je m'y suis bien pris ?
- si oui, qu'est-ce que j'oublie pour que l'objectdatasource ne demande
pas deux fois la liste à ma classe TransfertDatasource ?
- si non, comment aurais-je du m'y prendre ?


--
Faust
"Une âme en peine peut en cacher une autre"

5 réponses

Avatar
Jérémy Jeanson
Le souci est bien connu ;)

En fait si ton text à changé l'event du textbox alien avant celui du bonton.
Si le textbox n'a pas changé, seul l'event du bouton est déclanché.

Pluôt que de tranformer ton code ne usine à gaz, il suffit d'interdire à
ta méhtode de se lancer n fois.

Tu peux envisager d'utiliser un astuce qui marhc bien, comme déclarer un
boolean et le mettre à true lors de la première execution.
par exemple

private Boolean dejaFait;

private void TaMethode()
{
if(dejaFait) return;
dejaFait = true;
// faire ton insertion en BDD ici :)
}

--
Jérémy JEANSON
MCP
http://jeremy.blogdns.net
Avatar
Jérémy Jeanson
Si non tu peux toujours utiliser la propriété AutoPostBack de ton
Textbox sans rien changer dans ton code :)
--
Jérémy JEANSON
MCP
http://jeremy.blogdns.net
Avatar
Faust
ben justement, mon code de l'event pour le moment c'est ça:
// probablement nécessaire parce qu'on passe dans cet evenement
aussi par l'event Click
if (!CustomValidator1.IsValid) return;

if (TextBox1.Text != string.Empty)
{
// ajout de l'objet dans la liste

TextBox1.Text = string.Empty;
}


et ça marche bien
noter d'ailleurs le commentaire, je sais pas pkoi je suis obligé de le
faire mais c'est un fait: si je met pas la ligne, je sais plus dans
quel cas, mais la validation ne se fait pas

bref, donc en fait, j'ai déjà ce système de flag et il marche bien
le problème c'est que même en ne faisant rien au deuxième passage,
l'objectdatasource redemande quand même la liste des objets à afficher,
bien qu'il l'ait déjà fait au premier passage

/_Jérémy Jeanson_ a pensé très fort/ :
Le souci est bien connu ;)



En fait si ton text à changé l'event du textbox alien avant celui du bonton.
Si le textbox n'a pas changé, seul l'event du bouton est déclanché.



Pluôt que de tranformer ton code ne usine à gaz, il suffit d'interdire à ta
méhtode de se lancer n fois.



Tu peux envisager d'utiliser un astuce qui marhc bien, comme déclarer un
boolean et le mettre à true lors de la première execution.
par exemple



private Boolean dejaFait;



private void TaMethode()
{
if(dejaFait) return;
dejaFait = true;
// faire ton insertion en BDD ici :)
}



--
Faust
"Une âme en peine peut en cacher une autre"
Avatar
Faust
ben en fait, je viens de trouver, c'était justement l'autopostback qui
me posait problème :)
sans lui, ça marche impec :)

merci

/_Jérémy Jeanson_ a prétendu/ :
Si non tu peux toujours utiliser la propriété AutoPostBack de ton Textbox
sans rien changer dans ton code :)



--
Faust
"Une âme en peine peut en cacher une autre"
Avatar
Jérémy Jeanson
Comme quoi il faut souvent éviter de trop en faire dans son code et
commencer par utiliser simplement l'existant :)
--
Jérémy JEANSON
MCP
http://jeremy.blogdns.net