GridView Changer un ItemTemplate dans le code behind

Messages postés
38
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
23 février 2009
- - Dernière réponse :  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 ?
Afficher la suite 

10 réponses

Messages postés
32
Date d'inscription
mardi 5 décembre 2006
Statut
Membre
Dernière intervention
6 mars 2009
1
0
Merci
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.
Commenter la réponse de shogun_60
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
0
Merci
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;
    }
}
Commenter la réponse de RougailSaucisse
Messages postés
38
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
23 février 2009
0
Merci
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.
Commenter la réponse de sspizer
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
0
Merci
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.
Commenter la réponse de RougailSaucisse
Messages postés
38
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
23 février 2009
0
Merci
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.
Commenter la réponse de sspizer
Messages postés
19
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
24 février 2009
0
Merci
Salut,

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

Jag
Commenter la réponse de jagxx
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
0
Merci
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.
Commenter la réponse de RougailSaucisse
Messages postés
38
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
23 février 2009
0
Merci
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
Commenter la réponse de sspizer
Messages postés
32
Date d'inscription
mardi 5 décembre 2006
Statut
Membre
Dernière intervention
6 mars 2009
1
0
Merci
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
Essaye ça dans ton code Behind

((TextBox)GridView1.FindControl("TextBoxcommentaire")).Text=" Bonjour";
Commenter la réponse de shogun_60
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
0
Merci
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.
Commenter la réponse de RougailSaucisse