MySql et ASP.NET
Gestion de la date de création (champ CLI_CREATION)
- Si l’utilisateur saisie une date invalide -> Erreur.
- La date étant la date de création, elle devrait être automatique lors de l’insertion
- Le format d’affichage ne nous convient pas
Pour résoudre ces problèmes, il va falloir utiliser les templates (modèles).
Commençons par la GridView
Ouvrez le smart tag et cliquez sur Modifier les colonnes
Cliquez sur le + de BoundField pour voir la liste de vos champs
![]() |
Sélectionnez CLI_CREATION et cliquez sur Ajouter Headertext correspond à l’entête de colonne affiché. |
Avant modification, le code de la GridView se présentait comme ci-dessous
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" DataKeyNames="CLI_ID" >
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" />
</Columns>
</asp:GridView>
Après modification la ligne ci-dessous a été ajoutée.
<asp:BoundField DataField="CLI_CREATION" DataFormatString="{0:d}" HeaderText="Date de création"
SortExpression="CLI_CREATION" />
Si vous lancez l’application vous obtenez l’écran suivant.
Nous obtenons bien la date sous une forme plus conviviale, ainsi que le titre de la colonne, mais nous avons toujours la colonne CLI_CREATION.
En réfléchissant on peut comprendre que nous avons simplement ajouté une nouvelle colonne, mais les colonnes originales sont toujours présentes.
Comment obtenir le résultat escompté ?
Pour cela, il va falloir utiliser les templates.
Cliquez sur le smart tag de la GridView, modifier les colonnes, sélectionnez le champ CLI_CREATION dans la zone Champs sélectionnés, puis cliquez sur Convertir ce champ en templateField.
Cliquez sur OK
Retournons dans la source pour voir les changements.
| asp:TemplateField | Indique que c’est une colonne modèle |
| HeaderText="Date de création" | Définit l’entête |
| SortExpression="CLI_CREATION" | Définit le champ de tri si le tri est appliqué |
| <EditItemTemplate> | Définit le modèle en mode édition |
| asp:TextBox ID="TextBox1" runat="server" | Ce sera un TextBox (normal puisque l’on doit pouvoir éditer le champ) ID : représente un nom unique sur la page Runat= ‘’server’’ est obligatoire, il permet éventuellemnt d’accèder au contrôle en code behind (VB ou c#) |
| Text='<%# Bind("CLI_CREATION", "{0:d}")%>' | Permet de faire la liaison entre le contrôle et la valeur du champ dans la source de données. |
<asp:TemplateField HeaderText="Date de création" SortExpression="CLI_CREATION">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CLI_CREATION") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("CLI_CREATION", "{0:d}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Attardons nous sur cette dernière propriété.
Text='<%# Bind("CLI_CREATION", "{0:d}")%>'
Les caractères <%# %> signifient que ce qui est à l’intérieur doit être exécuté lors du chargement de la page.
Bind( Permet la liaison avec les données (valeur du champ CLI_CREATION) en lecture et écriture.
Enfin "{0:d}" est notre format d’affichage
Nous verrons dans un prochain article que <%# %> permettent d’effectuer d’autres fonctions que la liaison des données
| <ItemTemplate> | Définit le modèle en mode Select |
| <asp:Label ID="Label1" runat="server" | Cette fois ci c’est une étiquette (normal pour un simple affichage) |
| Text='<%# Bind("CLI_CREATION", "{0:d}")%>' | Permet de faire la liaison entre le contrôle et la valeur du champ dans la source de données. |
Encore une fois, attardons nous sur cette dernière propriété.
Je vous ai dis plus haut que Bind permet la liaison en mode lecture et écriture, alors pourquoi en mode écriture en mode sélect.
Important :
Personnellement je ne sais pas pourquoi l’assistant utilise Bind, alors qu’il existe la méthode Eval qui permet de récupérer les données seulement en mode lecture.
Text='<%# Eval("CLI_CREATION", "{0:d}")%>'
Lançons à nouveau l’application.
Comme vous pouvez le voir, la colonne CLI_CREATION est toujours visible ![]()
Nous devons donc modifier toutes les colonnes, pour éviter que la GridView affiche par défaut l’ensemble des champs de la requête Select.
De toute façon, nous devons changer les entêtes et ne pas afficher la colonne CLI_ID pour avoir un meilleur affichage.
Cliquez sur le smart tag de la GridView, puis ajoutez les colonnes CLI_ID, CLI_NOM et CLI_VALIDE
Dans la fenêtre de propriétés, effectuez les modifications suivantes :
CLI_ID Visible = false
CLI_NOM HeaderText = client
CLI_VALIDE Headertext = Valide
Les lignes suivantes ont été ajoutées
<asp:BoundField DataField="CLI_ID" HeaderText="CLI_ID" InsertVisible="False" ReadOnly="True"
SortExpression="CLI_ID" Visible="False" />
<asp:BoundField DataField="CLI_NOM" HeaderText="Client" SortExpression="CLI_NOM" />
<asp:BoundField DataField="CLI_VALIDE" HeaderText="Valide" SortExpression="CLI_VALIDE" />
Lançons encore une fois l’application
Nos colonnes sont toujours là !
(Pour les plus anciens d’entre nous ça commence à ressembler à l’histoire de Robert Lamoureux, ‘’Et le canard était toujours là’’)
Pour supprimer ces colonnes, il suffit d’ajouter AutoGenerateColumns="false"
Dans la ligne des caractéristiques de la GridView.
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="false" DataKeyNames="CLI_ID" Width="440px" >
Lancez à nouveau l’application. Voilà qui est mieux.
|
Date de création |
Client |
Valide |
|
24/01/2008 |
Christine |
True |
Enfin presque, parce que maintenant c’est la colonne valide qui n’a plus de case à cocher.
Nous nous occuperons de ce problème plus tard.
Une petite astuce au passage, vous n’êtes pas obligé d’arrêter l’application pour effectuer des modifications dans la source.
Faîtes vos modifications, enregistrez les et réactualisez votre page.
Cette méthode permet de gagner du temps lors de la création.
Essayons d’en terminer avec la date
Passons maintenant à l’insertion automatique de la date de création dans le DetailsView
Pour que la date soit insérée automatiquement, il nous faut une fonction directement dans la requête d’insertion.
Si nous utilisions SQL server ou Access, ce serait assez facile, puisqu’il suffirait de définir une valeur par défaut dans la structure de la table. Malheureusement avec MySql, il semble que cela ne soit pas possible.
Pour palier à ce problème il suffit d’insérer CURDATE() dans la requête comme ceci.
"INSERT INTO clients (CLI_NOM, CLI_CREATION, CLI_VALIDE) VALUES ( @CLI_NOM, CURDATE(), @CLI_VALIDE)"
Et de supprimer également le paramètre CLI_CREATION
Nous allons également utiliser les templates dans le DetailsView pour mieux maitriser la saisie.
Nous verrons celà dans un prochain article.




