Contrôle disparu du panel...

Résolu
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007 - 16 oct. 2005 à 15:11
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007 - 17 oct. 2005 à 09:24
Bonjour

Dans le cadre de mon boulot, je dois afficher des pages avec des champs soit en visualisation (labels) soit en saisie (textboxs) suivant les droits de l'utilisateur.
J'ai donc décidé dans le init() de la page de mettre soit un textbox soit un label dans un panel (présent en design).
Maheureusement quand je clique sur le bouton enregistrer de ma page, le panel ne contient aucun contrôle...

Comment résoudre ce casse tête ???...
Svp svp...
Merci

17 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2005 à 23:21
Quand je click sur le bouton j'ai bien sur la nouvelle valeur :p sinon ou serait l'interet ;)


Ton erreur est la : "je fais la création des contrôles et l'affichage des données de la base dans les contrôles dans le "if(!Page.IsPostback)" "

Toi tu rajoutes tes controles seulement si la page vient d'un postback ... donc quand tu cliques sur le bouton, tu ne rajoutes pas tes controles, donc comment voudrais tu qu'il y ait des controles dans ton panel ?

pour rappel : asp.net n'a pas de mémoire, il execute la requete et il t'oublie (le méchant!) donc tu peux bien lui ajouter tout ce que tu veux avant, meme si tu fais un postback il va executer ta page comme si c'etait la premiere fois ... d'ou la necessité de rajouter tes controles à chaque fois :) Par contre tu n'a pas besoin de reaffecter de valeur a tes textbox, car ces valeurs sont stockés dans le viewstate (sauf si tu as mis enableviewstate à false) et ensuite aprés le init il y a la procedure tartanpion (j'ai oublié son nom) qui va aller regarder dans le viewstate de la page postbacké et réassigner les valeurs aux differents controles (ceci se produit avant le page_load, d'ou l'importance de rajouter tes controles dans le page_init) :)

J'espere que c'est un peu plus clair, si t'as des questions hésites pas, c'est un des domaines d'asp.net que j'aime bien :)



<HR>
Cyril - MVS - MCP ASP
3
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 15:14
Je précise que j'avais 2 autres solutions :
- soit faire 2 pages différentes, une en visu, l'autre en saisie (g laissé tomber car si modif il y a à faire, faut la multiplir par 2)
- soit mettre un textbox et un label et rendre invisible l'un des deux suivant les droits (pas terrible car alourdit le poids de la page)

De plus j'ai une page qui contient environ 50 champs en modifs donc c pour ça que j'avais choisi la solution citée plus haut.

Donc je voulais savoir si qqun a eu ce genre de problème à mettre en place car je ne dois pas être le premier.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2005 à 15:29
On peut voir le code ? car la je peux pas t'aider.

Sinon une troisieme solution aurait été de faire un CustomControl dérivant de textbox, et suivant les droits tu overrides le render pour n'afficher que le texte ou tu laisses pour mettre un textbox.

En gros :

public class superTextbox inherits System.web.ui.textbox

private _isAdmin as boolean = false
public property isAdmin as boolean ' get et set à faire

overrides sub render(html as htmltextrender) ' ou un truc du genre
if _isAdmin
html.write(this.text)
else
mybase.render(html)
end if
end sub

end class

Puis t'as plus qu'a mettre tes superTextbox dans la page :) aprés je sais pas ce que ca donne pour le viewstate & co, je te donne l'idée aprés il faudra ajuster.


<HR>
Cyril - MVS - MCP ASP
0
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 15:54
Je vais avoir du mal à te donner le code vu que je ne suis pas au boulot aujourd'hui et que je n'ai pas VS... ;o)

Sinon ct un truc du genre (désolé pour les erreurs...) :
public sub MyPage_Load()
{
if(_IsAdmin)
{
// Ajout d'un Textbox
TextBox txt = new TextBox();
txt.Attributes.Add(...); // je rajoute tout ce qui me faut ici (évènements, propriétés etc...)
mypanel.Controls.Add(txt);
}
else
{
// Ajout d'un Label
Label lbl = new Label();
lbl.Attributes.Add(...);
mypanel.Controls.Add(lbl);
}
}

private sub MonBoutonClick()
{
string valeur = ((textbox)mypanel.Controls[0]).Value;
// Et c là que mypanel ne contient aucun contrôles car on est repassé côté serveur... alors que côté client y a bien un textbox
}
0

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

Posez votre question
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 15:55
Tu peux essayer de m'expliquer un peu plus ton idée car je ne la comprends pas forcément.
En tout cas merci de la rapidité de ta réponse (comme d'habitude d'ailleurs...) ;o)
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2005 à 16:06
Comment vivre sans Visual Studio :-| heureusement que notepad est installé par défaut ;)

Sinon pour le problème je pense que c'est du au fait que tu le rajoutes dans le page_load au lieu du page_init ... mais d'abord pourquoi tu met des textbox1.attributes.Add ? il va aussi faloir que tu mette un ID unique (vu que t'as plusieurs controles) donc textbox1.id = "textbox" & i.tostring() avec i un compteur dans une boucle ou autre

Ensuite pour ma solution, as tu deja fait des custom controls ? en gros dans ce cas il faudrais qu'au lieu d'avoir

Cyril - MVS - MCP ASP
0
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 16:33
Alors, pour ce qui est de l'absence de VS, au boulot je l'ai, pas à la maison car je ne programme pas en dehors du boulot... ;o)

Sinon "attributes.add" me sert pour rajouter des évènemens côté client et d'autres propriétés qui ne sont pas présentes quand tu tapes "textbox1.". Mais c du pareil au même, c déjà testé.
L'ID ne sert à rien. Car je met un seul contrôle par panel. Donc connaissant le nom du panel, je peux récupérer la valeur avec "((textbox)mypanel.Controls[0]).Value;".
En plus quand je met un ID (textbox1.ID "Numéro"), du côté client l'ID n'a pas été attribué (ID "_ctrl8 par exemple) mais ca c un autre problème...

Puis j'avais déjà essayé de mettre le code dans le init() et le load(), ca fait le même problème...

Et pour répondre à ta dernière question, oui g déjà fait des Custom Control donc tu peux m'expliquer sans problème ;o).
G un collègue qui m'a dit kil avait essayé le CustomControl (il avait le même cas que moi, soit saisie, soit modif) et il a laissé tombé car il avait eu trop de poblèmes et c trop long à mettre en place. Et le gros problème c kon me presse pour réaliser le projet et il ne me reste plus beaucoup de temps...

En plus g déjà fait pas mal de pages pour ce projet (environ 100 contrôles sont concernés) donc si je pouvais faire marcher ma solution, ca serait cool...

Merci de m'aider en tout cas.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2005 à 16:46
Pour résumer :

t'as une page classique avec un panel et dedans un seul label. et en bas de la page un bouton enregistrer

Ensuite dans le page_init tu veux que si l'utilisateur est admin, alors ce n'est pas un label mais un textbox à la place du label.

Le problème est que sur le click du bouton, ca plante ?


<HR>
Cyril - MVS - MCP ASP
0
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 17:03
Pour résumer : g un panel qui contient soit un label soit un textbox.
Cette association est réalisée dans le Init() (ou le Load()) de la page.
Ca ca marche, l'un ou l'autre s'affiche. L'utilisateur saisit les données dans le cas du textbox sans problème.

Le problème, sur le click du bouton (donc retour vers le serveur), la panel ne contient plus aucun contrôle. Donc pas moyen de récupérer la valeur saisie.
0
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 17:06
Je précise que si en design on met un textbox dans un panel, on arrive à récupérer la valeur.
Mais dans la cas où c fait dynamiquement, là je sèche...
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2005 à 18:05
http://www.aspfr.com/code.aspx?ID=21286 ca devrait t'aider.

Sinon, je regarderais plus en détails :)


<HR>
Cyril - MVS - MCP ASP
0
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 18:59
Mouai ca ressemble au truc que g fait mais y a une réponse de superBouly qui m'interpelle :
"Pkoi mes textbox créés dynamiquement disparaissent au postback et refusent de rendre l'info que g rentrée" (personne ne lui répond)

Grosso modo le problème que g...

Par contre je n'ai pas mis l'Autopostback sur mes contrôles mais je ne pense pas que se soit à cause de ça...
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2005 à 19:25
arf :s

j'ai pas répondu aux questions sous la source :( honte à moi ...

je teste ca dans la soirée alors (VPC de wista en cours donc pas de VS :'( )

l'autopostback n'a rien a voir avec tout ca.


<HR>
Cyril - MVS - MCP ASP
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
16 oct. 2005 à 21:12
Quand je fais :

public partial class Default3 : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
TextBox t = new TextBox();
t.ID = "txtbox1";
if (!Page.IsPostBack)
t.Text = "bonjour";


Panel1.Controls.Add(t);
}


protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(((TextBox)Panel1.FindControl("txtbox1")).Text);
}
}

Chez moi ca fonctionne, c'est quoi la difference avec toi ?



<HR>
Cyril - MVS - MCP ASP
0
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 21:56
La différence c que l'ajout se passe dans le "if(!Page.IsPostback)" si je me souviens bien.
Car en le mettant en dehors au bout d'un moment j'avais une erreur sur le rechargement de la page.

Et sur la page l'ID de ton textbox est bien "txbox1" ? Car ca chez moi ca ne marchait pas...
0
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
16 oct. 2005 à 21:59
A tout bien y réfléchir, je fais la création des contrôles et l'affichage des données de la base dans les contrôles dans le "if(!Page.IsPostback)" alors que toi tu ne fais que l'affichage.

Si tu modifies la valeur de ton textbox, quand tu cliques sur le bouton, tu as quelle valeur, la nouvelle ou l'ancienne ?

Demain, au taf, je testerai tout ça et je te tiendrai au courant.
0
cs_DevilYann Messages postés 57 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 12 septembre 2007
17 oct. 2005 à 09:24
En fait avant de lire ton dernier message, j'avais fait comme ton exemple en mettant la création des contrôles en dehors du test.
Et ca marche !
C vrai que je ne voyais pas comment il pouvait réaffecter les données après la création à nouveau des contrôles.
Mais là c plus clair avec le viewstate.

Je te remercie beaucoup pour ton aide, tu m'enlèves une sacrée épine du pied.
@+
0
Rejoignez-nous