[ASP .NET]Création d'une gridview semi éditable

Je me demande s’il est possible d’avoir une Gridview dans laquel un certain nombre de colonnes sont éditable tandis que d’autres restent inchanger.

Je m’explique, j’ai en ce moment, une gridview qui affiche les projets en cours de la personne, à côté de sa liste, on y trouve 1 ou plusieurs colonnes éditables où l’utilisateur devra saisir quelques informations sans pour autant avoir la possibilité de modifier la colonne qui affiche les projets.

Le résultat de la première colonne est généré via une requete de la SQLDataSource.
Les autres champs ont été ajouté par la suite manuellement via l’Edit Template.

Mais le problème c’est que je ne vois pas comment rendre ces Template editable.

Un petit exemple :

[code]----------------------------------------------------------------------------------------------
“Nom de Projet” (non éditable) | “Heures” (éditable dans une Textbox) | “Description” (idem)

Projet N° 1 | |

Projet N° 6 | |
----------------------------------------------------------------------------------------------[/code]

la version 2.0 du framework a rajouté pour les DataGridWriew de maginifiques colonnes ItemTemplate.

<asp:TemplateField HeaderText="Disponible" SortExpression="disponible" meta:resourcekey="BoundFieldRessource5"> <ItemTemplate> <asp:Label ID="lblDispo" runat="server" Text=<%#TexteDispo(Convert.ToInt32(Eval("disponible"))) %> ForeColor=<%#CouleurDispo(Convert.ToInt32(Eval("disponible"))) %> > </asp:Label> </ItemTemplate> </asp:TemplateField>

Pour récupérer la valeur que tu met dedans c’est un peu plus galère par contre. Personnellement je rajoute un bouton de sélection à mon DataGridView, je m’abonne donc à l’événement SelectedIndexChanged, et la méthode FindControl du gridViewRow sélectionné te permet de récupérer ton TextBox.

Peut être qu’il y a plus simple d’ailleurs…

Exemple rapide du code que j’ai dans mon handler:

GridViewRow row = VueProduits.SelectedRow; TextBox txtPrix = (TextBox)row.FindControl("txtPrix"); TextBox txtQte = (TextBox)row.FindControl("txtQte");

EDIT: ah oui j’ai copié collé du code à moi, et je n’ai pas vu que c’était un label dans ce cas :stuck_out_tongue: Mais tu peux mettre ce que tu veux dans un ItemTemplate

Merci bien, ca marche imppec. Par contre, si je veux enregistrer toute la grid d’un coup sans passer par le Select de la Gridview, ca se passe comment pour la récupération des données ?

Je n’ai jamais essayé, mais j’imagine qu’il suffit de te mettre un petit bouton submit tout ce qu’il y a de plus bête et de parcourir ton gridview.

Maintenant dans mon parcours j’ai un léger hic. Comment peut on récupérer le contenu d’une Boundfield sachant qu’elle ne semble pas etre un itemTemplate ?

<asp:GridView ID="GridV_FormProjets" runat="server" BorderStyle="Solid" BorderWidth="1px" BorderColor="Black" AllowPaging="True" Visible="false" AllowSorting="True" AutoGenerateColumns="False" DataSourceID="dsFiche" DataKeyNames="idProjet" CellPadding="4" ForeColor="#333333" GridLines="None"> <Columns> <asp:BoundField DataField="nomProjet" HeaderText="Nom du projet" /> <asp:TemplateField HeaderText="Nbre heures"> <ItemTemplate> <asp:TextBox ID="TxtB_nbHeure" Width="80px" MaxLength=2 runat="server"></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>

Il y a beaucoup plus simple, maintenant les Gridview etc. sont bindable dans les 2 sens : à la plca de Eval(“NomDuChamp”) tu mets Bind(“NomDuChamp”), et là tu auras ton binding effectué correctement dans les 2 sens, sans avoir à récupérer les valeurs des contrôles.

Je ne comprend pas trop ce que tu veux dire par là. :stuck_out_tongue: Je sais bien ce que font les Eval et les Binding, mais il me semble que celà fonctionne uniquement si le nomDuChamp est reconnu dans une de mes SqlDataSource à moins que j’ai tout faux. De toute facon, j’ai trouvé comment faire entre temps ^^. Il est juste dommage qu’il faille que j’affiche l’Id d’une de mes tables pour faciliter le traitement plus tard.

Il « faut » pas forcement, t’es pas obligé :stuck_out_tongue: m’enfin si ca marche…

Aaarg, j’ai un autre problème. Je veux pouvoir mettre dans une des cellules de type Itemtemplate, une valeur que me retourne une requete qui lui se trouve dans mon code-behind.

L’itemTemplate contient une Textbox. Si j’assigne la valeur au champ text de la cellule il m’est impossible d’éditer cette dernière.

[code]// sdr étant ma SqlDataReader

// Euh, ca ne marche pas si je fais çà
GridV_FormProjets.Rows[index].Cells[2].FindControl(“TxtB_nbHeure”).TemplateControl = sdr.GetInt16(2).ToString();

// Là ca marche, mais le champ n’est plus éditable
GridV_FormProjets.Rows[index].Cells[3].Text = sdr.GetString(3);[/code]