Repeater et UserControl

marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006 - 17 août 2005 à 15:05
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006 - 24 août 2005 à 11:29
Je cherche à afficher des données dans un repeater mais je veux en plus pouvoir modifier ce que je vais afficher en fonction de certaines données que je récupère dans mes tables (j'ai vu une discussion qui en parlait -http://www.aspfr.com/forum.v2.aspx?id=90350- mais ça ne m'a pas permis de m'en sortir ).
J'ai donc voulu intégrer des TextBox pour pouvoir les afficher ou les cacher mais je ne pouvais pas y accèder.
J'ai alors tenté de remplacer la table de mon repeater par un UserControl contenant une table avec des TextBox ( normalement ça marche, je l'ai vu sur d'autres sites ), oui mais maintenant c'est le userControl placé dans mon Repeater que je n'arrive pas à récupérer.

Voici le code en entête:

<%@ Register TagPrefix="uc1" TagName="UCRepeater" Src= "webusercontrol.ascx" %>

Voici le code du repeater:


<HeaderTemplate>
Entete du repeater
</HeaderTemplate>



<FooterTemplate>
</FooterTempalte>


le code c#:
{
string Requete;
string sConnexion =sConnexionGlobale;
OleDbConnection oConnexion = new OleDbConnection(sConnexion);

Requete = " SELECT * FROM INTERVENTIONS";

OleDbDataAdapter myAdapter = new OleDbDataAdapter(Requete,oConnexion);

DataTable myDataTable = new DataTable();
myAdapter.Fill(myDataTable);

PagedDataSource myPager;
myPager = new PagedDataSource();
myPager.DataSource = myDataTable.DefaultView;
myPager.AllowPaging = true;
myPager.PageSize = 10;
myPager.CurrentPageIndex = index;


ListeInterventions.uc1.UCRep1.TB_Nom.Text= "3"; // marche pô
Page.Controls.ucRep1.DataSource = myPager; // marche pô non plus

ListeInterventions.DataSource = myPager;
ListeInterventions.DataBind();

oConnexion.Close();
}
Voilà si quelqu'un a une idée du pourkoi du comment, Merci.

11 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
17 août 2005 à 15:29
as ton avis pourquoi cela ne fonctionne pas ? si tu as 15 enregistrements dans ton repeater la ligne que tu veux devra aller sur quelle usercontrol ?

la solution est de se servir de l'evenement databound de ton repeater qui te permettra grace a e de recuperer la ligne en cours aprés un simple

(textbox)((UCRep1)e.item.FindControl("UCRepeater1")).findcontrol("idtextbox").text = "truc";

normalement un truc comme ca ca marche :)

<hr> Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
18 août 2005 à 09:52
Merci pour ta réponse,
J'ai donc utilisé la syntaxe suivante:

((TextBox)((Repeater)e.Item.FindControl("UCRep1")).FindControl("TB_Nom")).Text = "truc";

Mais ça marche pas, il me renvoie l'erreur suivante ( pas très gentille d'ailleurs ):

Object reference not set to an instance of an object.

Je trouve pas ça très cool de ça part, mais ce qui est encore moins cool c'est que, quand je remplace "UCRep1" ou "TB_Nom" par n'importe quoi d'autre, il me met la même erreur, il ne se rend pas compte que ça n'existe pas.

Ca veut dire ke les 2 FindControl ils ont rien touvé du tout. :(
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
18 août 2005 à 19:11
et t'as regardé en debug les controles contenu dans e.item ?


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
22 août 2005 à 09:35
Euh...Non.
Comment tu fais ça?
0

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

Posez votre question
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
22 août 2005 à 09:38
J'ai parfois l'impression que la plupart des gens ne connaisssent pas cette fonctionalité pourtant basique :)

sur la ligne de ta fonction tu appuies sur F9 ce qui rajoutera un point d'arret puis tu fais F5 pour lancer en debug :) et tu pourras voir la valeur de toutes les variables ...


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
22 août 2005 à 11:50
Losque j'appuie sur F9, il se passe rien. J'imagine qu'il doit s'afficher un rond rouge à gauche de la ligne.
Ca viendrait pas du fait que tu utilise VS alors que moi j'utilise WebMatrix?
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
22 août 2005 à 11:57
arf c'est vrai que webmatrix est trés trés limité au niveau de tout, c'est meme une honte que Ms ai sortit ca ... heureusement ils se sont rattrapé en sortant visual web dev pour .net 2 :)

Donc si tu peux utiliser soit VS soit VWD tu verras ce sera beaucoup plus simple pour tout :) sinon tu as toujours le response.write :(

for each c as control in e.item.controls
response.write(c.getType.tostring)
next

Mais ton code tu l'as mis ou ? tu l'as bien mis sur l'evenement databound (ou qqchose du genre) du repeater ?


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
22 août 2005 à 14:48
c pas gentil de critiquer WebMatrix, il est gratuit, il est pas lourd et il y a un serveur local, c'est quand même sympa pour tester ses applications quand t'as pas de serveur. Maintenant j'en ai un donc c'est vrai que je pourrais passer à autre chose. VisualWebDev, c'est gratuit?

Sinon mon code est bien dans la fonction
void ListeInterventions_ItemDataBound(object sender, RepeaterItemEventArgs e)
et quand j'utilise ton bout de code utilisant Response.Write, il affiche bien les noms des éléments présents dans mon repeater par contre quand je fais:
Response.Write( e.Item.FindControl("UCRepeater1").ID );
il est pas content alors que UCRepeater est bien un ID, je l'ai affiché dans le for:
foreach(Control c in e.Item.Controls)
{
Response.Write( " " + c.ID );
}

Je comprends pas très très bien.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
22 août 2005 à 16:29
Je me rappelle plus :$

En ce moment je fais du javascript et ca fait "longtemps" que j'ai pas touché à .net (honte à moi)

j'y regarde ce soir, dès que j'ai le temps :)

Si je critique WebMatrix il y a plein de raison, certe il est gratuit, mais il ne sert pas à grand chose, on ne tire pas de la puissance de la technologie ... et c'est vraiment bien dommage :-/ je trouve que ca a été un outil pour concurrencer php, pour que les débutants se mettent à cette techno plutot que php, mais il n'a jamais permis de faire des choses correcte :-/

Visual Web Dev, est pour l'instant gratuit, mais pour l'instant en beta2 (stable ce site tourne dessus) et il permet beaucoup de se servir de .net comme il se doit, il possede bien sur un mini serveur (qui s'appelle cassini et on est pas obligé d'avoir webmatrix pour l'utiliser :)) le seul problème c'est que c'est du .net 2 donc beta jusqu'a novembre, son prix final devrait etre modique, je me souviens plus mais pas enorme par rapport a ce qu'il offre. http://lab.msndn.microsoft.com/

pour ton problème je m'y replongerais ce soir :) car la je vois pas :/


<HR>
Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 août 2005 à 01:30
Je viens d'essayer et pour moi ca fonctionne correctement

void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
WebUserControl c = (WebUserControl)e.Item.FindControl("WebUserControl1");
TextBox txt = (TextBox)c.FindControl("txt1");
txt.Text = ((System.Data.DataRowView)e.Item.DataItem).Row.ItemArray[1].ToString();
}

Cyril - MCP ASP.net
Webmaster de : Hoshimi.CodeS-SourceS.fr
0
marhoa Messages postés 41 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 17 octobre 2006
24 août 2005 à 11:29
Ok, ça marche comme ça:
Control c = (Control)e.Item.FindControl("UCRepeater1");
TextBox tbNom = (TextBox)c.FindControl("TB_Nom");
tbNom.Text = "nom prénom";

j'arrive à atteindre les textbox et labels de mon usercontrol et je peux les modifier mais ça va pas, j'arrive pas à faire ce que je veux - et le bouquin de richard clark qui est toujours en rupture de stock! je suis au bord de la crise de nerfs! :) -

J'essaie plein de trucs et il y a toujours un endroit ou ca bloque.
Avec le usercontrol, on est obligé de travailler dans une fonction récupérant en paramète une variable de type RepeaterItemEventArgs, ce qui est le cas uniquement pour ItemCreated et ItemDataBound si j'ai bien compris. Malheureusement lorsque ces évenements sont éxecutés, il semble que les données ne sont pas encore écrites sur la page, moi qui voulait faire des tests sur ces données ! :( En plus, je sais pas comment récupérer les données de ma requète à partir de là ( je sais je suis nul ) ...
J'ai aussi réessayé en enlevant le usercontrol et en mettant les textbox et label directement dans le repeater mais là non plus j'arrive pas à accéder aux données.


TextBox tbAdresse = (TextBox)ListeInterventions.FindControl("TB1");
if( tbAdresse !null ) tbAdresse.Text "il est là!!!";
Avec ça, il affiche rien dans mlon textbox et si je fais pas le test y'a une erreur de référence sur l'objet.

En tout ca merci, tu m'as bien fait avancer, t'embète pas à essayer de comprendre, je vais laisser comme c'était avant, c'est plus moche mais ça marche et surtout il faut que j'avance dans mon projet ( je verrai ça plus tard si j'ai le temps)
Encore une fois merci de ton aide.
0
Rejoignez-nous