GridView Changer un ItemTemplate dans le code behind

sspizer Messages postés 38 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 23 février 2009 - 16 févr. 2009 à 14:35
 Zoum - 12 nov. 2014 à 12:10
Bonjour,
j'ai :
<asp:GridView
ID="_grv"
OnRowDataBound="Grv_DataBound"
runat="server">
<Columns>
<asp:TemplateField> 

   <ItemTemplate>
      <asp:TextBox
ID="_txt"
Value='<%# Eval("Toto") %>
'
runat="server"
/>
   </ItemTemplate>
</asp:TemplateField>
</Column>

Maintenant j'aimerais dans mon code behind changer le style de ma textbox par exemple:
_txt.ReadOnly = true;

Seulement si on utilise cette synthaxe il ne trouve pas _txt et je veux absolument le faire avant qu'il commence à générer des lignes et donc ne pas le faire dans le OnRowDataBound.

Je dois m'y prendre comment ?

10 réponses

shogun_60 Messages postés 30 Date d'inscription mardi 5 décembre 2006 Statut Membre Dernière intervention 6 mars 2009 1
16 févr. 2009 à 15:43
Salut,

Pourquoi ne pas le mettre dans la partie aspx comme ceci :


<


asp


:


GridView


ID


="_grv"


OnRowDataBound


="Grv_DataBound"


runat




="server">
<



Columns




>




<


asp


:


TemplateField


>
 
   <ItemTemplate


>
      



<


asp


:TextBox


ID


="_txt"


Value


='
<%# Eval("Toto") %>' runat="server" ReadOnly="true"


/>
   



</


ItemTemplate




>




</


asp


:


TemplateField



>
</Column>

Sinon essayes l'evenement rowCreated peut-être.
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
17 févr. 2009 à 07:06
bonjour,

Je ne suis pas sur d'avoir bien saisi le "je veux absolument le faire avant qu'il commence à générer des lignes". Tu ne peux bien sur pas faire cela avant de générer les lignes car justement les lignes (et donc les controles inside) n'existent pas encore ^^.
Enfin peu importe, et comme l'a dit shogun tu peux très bien utiliser l'event RowCreated (qui de toute facon sera executé avant le rowdatabound si c'est ce que tu souhaite) comme ceci par exemple:

protected void Grv_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        TextBox tb = e.Row.Cells[0].Controls[1] as TextBox;
        if (tb != null)
            tb.BackColor = System.Drawing.Color.Bisque;
    }
}
0
sspizer Messages postés 38 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 23 février 2009
18 févr. 2009 à 10:20
Je vais essayer d'être plus clair dans ce que je veux faire ^^ :D.
Voila en fait quand je met une textbox dans mon gridview, il va répéter cette textbox pour chaque Objet issu du DataBound.




Par exemple:



Data = 10 Rows.
J'aurai donc 10 fois ma textbox, maintenant imaginons que j'ai envie de changer une propriété de ma textbox dans mon code behind car ça dépend d'un événement qui se passe.

Par exemple quand je reçois en session (Session["mode"] = "ReadOnly"), j'aimerais dans mon code behind changer une propriété de chaque TextBox générée par le gridview, par exemple changer ça propriété ReadOnly = true.
 
Maintenant deux possibilité s'offrent à moi:

1) Utiliser l'évenement OnRowDataBound récupérer dans chaque ligne ma TextBox et changer sa propriété et donc lancer 10 fois l'évenement.

2)Changer la TextBox original avant génération et affecter sa propriété ReadOnly = true avant génération. (cependant je n'arrive pas à y accéder)

Et ce que je cherche à faire c'est justement le 2) ! 

Voila ça devrait vous aider =).
En tout cas merci mille fois pour votre aide.
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
18 févr. 2009 à 17:34
euh dans ce cas, je dirai ptet de faire un systeme basé sur les thèmes. en fonction de ce que tu recois dans ta variable de session, tu charges un theme.
Puis dans chaque theme tu definis une textbox avec un skinID (dans un theme Textbox sans ReadOnly et dans l'autre avec) et dans ta gridview tu mets la <:asp:Textbox skinId="GvTextBox" .... />. Je ne sais pas si ca marche comme il le faudrait, mais à essayer et tu me diras.
0

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

Posez votre question
sspizer Messages postés 38 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 23 février 2009
23 févr. 2009 à 13:31
Pourquoi aller dans la complexité tout ce que je veux c'est accéder au control "_txt" que j'ai dans mon code là et le changer avant que le gridview commence à générer ces lignes.

En gros "_txt" est un modèle et j'aimerais que ce model soit changé avant que le GridView l'utilise.

Et il faut que ça soit fait dans le codebehind.
0
jagxx Messages postés 19 Date d'inscription mardi 17 décembre 2002 Statut Membre Dernière intervention 24 février 2009
23 févr. 2009 à 16:49
Salut,

Essaie de le faire dans l'evenement PreInit de la page.

Jag
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
23 févr. 2009 à 20:37
Je dois mal comprendre la question decidement. comment veux-tu modifier un control qui n'existe pas encore a l'instant t?
Pour y avoir acces, il faut obligatoirement qu'il ait été crée non? (ah moins d'utiliser un systeme de theme comme je disais précédemment)
et étant donné qu'il s'agit d'un control dépendant de ta source de données liées a la datasource comment veux-tu en modifier les propriétés dans le pre-init ou autre event precedent le databound?
Franchement je ne vois pas ce qu'il y a de mal a le faire dans le rowdatabound ou rowcreated, c'est 4 lignes de code.
0
sspizer Messages postés 38 Date d'inscription mercredi 4 juillet 2007 Statut Membre Dernière intervention 23 février 2009
24 févr. 2009 à 10:49
Hum l'objet existe bien puisqu'on le visualise dans la page ascx. Il doit y avoir un moyen d'y avoir accès avant que le gridview commence à l'utiliser. Je pense que ca peut marcher dans le rowdatabound mais en fait mon soucis cest ca:

Si on a :
< asp
:TextBox ID
="_txt" Value
='
<%# Eval("Toto") %>'
runat="server" ReadOnly="true" />

Maintneant on veut pour une raison X qu'il ne bind pas Value!
Si je le faisais dans le RowCreated ou RowDataBound, j'arriverais au moment où il aurait déjà bindé. Alors que si j'y accéde avant génération non seulement j'empeche le binding et en plus ca sera general a toutes les lignes de mon gridview
0
shogun_60 Messages postés 30 Date d'inscription mardi 5 décembre 2006 Statut Membre Dernière intervention 6 mars 2009 1
24 févr. 2009 à 11:41
Salut,

A ta place je laisserais Value = "" par défaut.

Ensuite, dans l'evenement RowDataBound de ton GridView je ferais :

Dim TaTextBox
As TextBox = gv.Rows(e.Row.RowIndex).FindControl(
"_txt")
Pour récupérer le control TextBox de ta ligne.

Une fois que tu as récupérer le control tu peux en faire ce que tu veux, par exemple :

If taCondition =
True
Then



        TaTextBox .Text =





"Ta valeur si True"








Else


        TaTextBox .Text =





"Ta valeur si False"



Voila, j'espère que ca répond à ta question
0
Essaye ça dans ton code Behind

((TextBox)GridView1.FindControl("TextBoxcommentaire")).Text=" Bonjour";
0
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
24 févr. 2009 à 21:25
non l'objet n'existe pas. Le template de l'objet existe mais l'objet sera crée uniquement si des données sont liés la grid. S'ils n'y a pas de données liées ton controle n'existera pas. ainsi il faut attendre de savoir s'il y a des données avant de créer le controle. Et cela se passe lors d'un rowdatabound.
D'autre part,la solution de shogun semble tout a fait correcte.
0