I. INTRODUCTION▲
I-A. Objectif▲
Cet article présente avec des exemples simples les différentes techniques liées au développement d'application Web avec ASP.Net et VB.Net. Parmi celles-ci, on peut trouver :
- les Web forms ;
 - les tags d'ASP.Net (dont le DataGrid) ;
 - l'internationalisation par les fichiers de ressources ;
 - l'accès aux données (chaîne de connexion, DataReader, Entity Framework, LINQ) ;
 - la validation des formulaires ;
 - la page maître ;
 - la manipulation des fichiers ;
 - les Ajax Controls (Ajax Control Toolkit).
 
I-B. Versions utilisées▲
Les versions utilisées des logiciels pour réaliser cet article sont :
- Microsoft .NET Framework 4.5 ;
 - Microsoft® SQL Server® 2014 Express (With Tools qui a l'avantage de contenir également le SQL Management Studio) ;
 - Microsoft Visual Studio Express 2013 pour le Web ;
 - Ajax Control Toolkit .NET 4.5.
 
Pour information dans un environnement 32 bits, cela donne des fichiers avec les noms suivants :
- dotNetFx45_Full_setup.exe ;
 - SQLEXPRWT_x86_FRA.exe ;
 - VS2013_RTM_WebExp_FRA.iso ;
 - AjaxControlToolkit.Binary.NET45.zip.
 
II. INSTALLATIONS▲
II-A. Installation du framework .Net▲
Lancer l'exécutable « dotNetFx45_Full_setup.exe ».
Cocher la case « J'ai lu les termes du contrat de licence et je les accepte. ».
Le logiciel d'installation procède au téléchargement des éléments et réalise l'installation.
Une fois l'installation terminée, il suffit de cliquer que le bouton « Terminer ».
II-B. Installation de SQL Server Express▲
Lancer l'exécutable « SQLEXPRWT_x86_FRA.exe ».
Choisir un dossier pour l'extraction des fichiers d'installation.

Les fichiers d'installation sont extraits.

Cliquer sur le lien « Nouvelle installation autonome SQL Server ou ajout de fonctionnalités à une installation existante ».
Cocher « J'accepte les termes du contrat de licence » et cliquer sur le bouton « Suivant > ».
Cocher « Utiliser Microsoft Update pour rechercher les mises à jour (recommandé) » et cliquer sur le bouton « Suivant > ».
Cliquer sur le bouton « Sélectionner tout » et cliquer sur le bouton « Suivant > ».
Cliquer sur le bouton « Suivant > ».
Cliquer sur le bouton « Suivant > ».
Cliquer sur le bouton « Suivant > ».
Le logiciel réalise l'installation.
Cliquersur le bouton « Fermer ».
Fermer le logiciel d'installation.
II-C. Installation de Visual Studio Express▲
Décompresser le fichier « VS2013_RTM_WebExp_FRA.iso » (avec 7-Zip par exemple).
Lancer l'exécutable « vns_full.exe ».
Cocher « J'accepte les termes du contrat de licence et la déclaration de confidentialité. ». Décocher « Adhérez au Programme d'amélioration du produit Visual Studio pour nous aider à améliorer la qualité, la fiabilité et les performances de Visual Studio (facultatif). » Cliquer sur le bouton « Installer ».
Le logiciel réalise l'installation.
Cliquer sur le bouton « Redémarrer maintenant ».
III. « BONJOUR LE MONDE ! »▲
Dans ce chapitre, nous allons réaliser l'exemple de plus simple : une page qui affiche « Bonjour le monde ! ».
Cela sera fait en deux étapes : une première où le texte est inscrit directement dans la page et une deuxième où le texte est stocké dans un fichier de ressources globales.
III-A. Création de l'application▲
Lancer « VS Express 2013 pour le Web » (
). 
Cliquer sur « Me le proposer ultérieurement ».
Choisir « Nouveau projet… » dans le menu « Fichier ».
Sélectionner « Application Web ASP.NET vide ». Saisir le nom du projet. Puis, cliquer sur le bouton « OK ».
III-B. Création de la page bonjour.aspx▲
Dans l'« Explorateur de solutions ». Choisir « Ajouter » / « Nouvel élément… ».
Choisir « Web Form ». Saisir le nom du fichier (« bonjour.aspx »). Puis cliquer sur le bouton « Ajouter ».
Saisir le code suivant dans « bonjour.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="bonjour.aspx.vb" Inherits="DeveloppezAspNet.bonjour" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Bonjour</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    Bonjour le monde.
    </div>
    </form>
</body>
</html>On remarque que le code de la page est très simple pour le moment. Il ne contient (presque) que du HTML. On note tout de même la présence de la directive « Page » qui indique le fichier source contenant le code VB.Net et la balise « form » qui a un attribut « runat » qui indique que cette balise nécessite un traitement sur le serveur avant envoi vers le navigateur Web.
III-C. Lancement de la page▲
Lancer l'application en cliquant sur l'icône de lancement (
). 
Visual Studio se charge d'ouvrir une fenêtre ou un onglet dans le navigateur avec le résultat.
III-D. Externalisation des libellés dans une ressource globale▲
Ajouter le dossier ASP.NET « App_GlobalResources ».
Choisir d'ajouter un fichier de ressources dans le dossier ASP.NET « App_GlobalResources ».
Conserver le nom « Resource1 » et cliquer sur le bouton « OK ».

Entrer les valeurs des chaines dans le fichier de ressources.
Modifier le code de « bonjour.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="bonjour.aspx.vb" Inherits="DeveloppezAspNet.bonjour" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title><asp:Literal runat="server" Text="<%$ Resources:Resource1, titre_bonjour %>" /></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:Label runat="server" Text="<%$ Resources:Resource1, libelle_bonjour_le_monde %>" />
    </div>
    </form>
</body>
</html>Le code ASP.Net a très peu changé. On note juste la présence des balises « asp:Label » pour indiquer que les libellés sont dans la ressource globale « Resource1 ».
Les libellés du fichier de ressources sont désormais visibles dans la page Web.
IV. AFFICHAGE DE DONNÉES EN BASE▲
Dans ce chapitre, nous allons réaliser une page permettant d'afficher des informations que l'on aura chargées en base par script SQL réalisant des insertions.
Nous procéderons à nouveau en plusieurs étapes. En premier, nous afficherons les valeurs d'une base locale en itérant sur les valeurs depuis le code VB.Net pour les ajouter au tableau. Ensuite, nous remplacerons ce procédé d'itérations par un contrôle DataGrid. Pour finir, nous déplacerons la base locale par une base en réseau.
IV-A. Création de la base de données en local▲
Ajouter le dossier ASP.NET « App_Data ».
Choisir d'ajouter un nouvel élément dans le dossier ASP.NET « App_Data ».
Choisir « Base de données SQL Server ». Saisir un nom. Cliquer sur le bouton « Ajouter ».
Ajouter une nouvelle table dans la base juste créée.
Renseigner la table LISTECOURSES. Puis cliquer sur « Mettre à jour ».
Cliquer sur le bouton « Mettre à jour la base de données ».
Choisir « Nouvelle requête ».
Saisir la requête suivante.
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Banane', 3); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Sucre blanc', 75); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Oeuf', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Levure', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Sel', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Farine', 150); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Beurre', 70);Exécuter la requête en cliquant sur l'icône d'exécution (
). 
Les enregistrements sont présents dans la base de données.
IV-B. Création de la page d'affichage▲
Choisir d'ajouter un fichier de ressources dans le dossier ASP.NET « App_LocalResources ».
Choisir d'ajouter un fichier de ressources dans le dossier ASP.NET « App_LocalResources ». Le nommer « liste.aspx.resx ». Entrer les valeurs des chaines dans le fichier de ressources.
Créer la page « liste.aspx ».
Modifier le code de « liste.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="liste.aspx.vb" Inherits="DeveloppezAspNet.liste" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title><asp:Literal runat="server" Text="<%$ Resources:titre_liste_courses %>" /></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
        </div>
    <div>
    <asp:Table ID="Table" runat="server" BorderWidth="1" GridLines="Both">
        <asp:TableHeaderRow runat="server">
            <asp:TableHeaderCell><asp:Literal runat="server" Text="<%$ Resources:colonne_identifiant %>" /></asp:TableHeaderCell>
            <asp:TableHeaderCell><asp:Literal runat="server" Text="<%$ Resources:colonne_libelle %>" /></asp:TableHeaderCell>
            <asp:TableHeaderCell><asp:Literal runat="server" Text="<%$ Resources:colonne_quantite %>" /></asp:TableHeaderCell>
        </asp:TableHeaderRow>
    </asp:Table>
    </div>
    </form>
</body>
</html>La page ASP.Net contient un tableau vide. On remarque que les balises « asp:Table », « asp:TableHeaderRow » et « asp:TableHeaderCell » ont également un attribut « runat ».
Modifier le code de « liste.aspx.vb » :
Imports System.Data.SqlClient
Public Class liste
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim MyConnexion As SqlConnection = Nothing
        Try
            MyConnexion = New SqlConnection("Data Source=(LocalDB)\v11.0;" & _
                                                                 "AttachDbFilename=|DataDirectory|\Database1.mdf;" & _
                                                                 "Integrated Security=True;")
            Dim MyCommand As SqlCommand = New SqlCommand("SELECT * FROM LISTECOURSES", MyConnexion)
            MyConnexion.Open()
            Dim MyReader As SqlDataReader = MyCommand.ExecuteReader
            If MyReader.HasRows Then
                Do While MyReader.Read
                    Dim MyRow As TableRow = New TableRow
                    Dim MyCellId As TableCell = New TableCell
                    Dim MyCellLibelle As TableCell = New TableCell
                    Dim MyCellQuantite As TableCell = New TableCell
                    MyCellId.Text = MyReader.GetInt32(0)
                    MyCellLibelle.Text = MyReader.GetString(1)
                    MyCellQuantite.HorizontalAlign = HorizontalAlign.Right
                    MyCellQuantite.Text = MyReader.GetInt32(2)
                    MyRow.Cells.Add(MyCellId)
                    MyRow.Cells.Add(MyCellLibelle)
                    MyRow.Cells.Add(MyCellQuantite)
                    Table.Rows.Add(MyRow)
                Loop
            Else
                Erreur.Text = "Pas de lignes de résultat"
            End If
        Catch MyException As Exception
            Erreur.Text = MyException.Message
        Finally
            If Not IsNothing(MyConnexion) Then
                If MyConnexion.State = ConnectionState.Open Then
                    MyConnexion.Close()
                End If
            End If
        End Try
    End Sub
End ClassLe code VB.Net utilise une Command et un DataReader pour récupérer les valeurs en base et ajouter des lignes au tableau. On peut noter que l'éventuel message d'erreur est affiché grâce à une balise « asp:Label ».
Cela donne le résultat suivant :
IV-C. Modification pour utiliser un DataGrid▲
Modifier le code de « liste.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="liste.aspx.vb" Inherits="DeveloppezAspNet.liste" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title><asp:Literal runat="server" Text="<%$ Resources:titre_liste_courses %>" /></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
        </div>
        <div>
            <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                    <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                    <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
                </Columns>
            </asp:DataGrid>
        </div>
    </form>
</body>
</html>Modifier le code de « liste.aspx.vb » :
Imports System.Data.SqlClient
Public Class liste
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim MyConnexion As SqlConnection = Nothing
        Try
            MyConnexion = New SqlConnection("Data Source=(LocalDB)\v11.0;" & _
                                                                 "AttachDbFilename=|DataDirectory|\Database1.mdf;" & _
                                                                 "Integrated Security=True;")
            Dim MyCommand As SqlCommand = New SqlCommand("SELECT * FROM LISTECOURSES", MyConnexion)
            MyConnexion.Open()
            Dim MyReader As SqlDataReader = MyCommand.ExecuteReader
            DataGrid.DataSource = MyReader
            DataGrid.DataBind()
        Catch MyException As Exception
            Erreur.Text = MyException.Message
        Finally
            If Not IsNothing(MyConnexion) Then
                If MyConnexion.State = ConnectionState.Open Then
                    MyConnexion.Close()
                End If
            End If
        End Try
    End Sub
End ClassDans la page ASP.Net, le tableau est remplacé par un contrôle DataGrid. Le code VB.Net devient plus simple, car le DataReader est directement traité par le contrôle DataGrid.
Cela donne le résultat suivant :
IV-D. Création de la base de données en réseau▲
Lancer « SQL Server 2014 Management Studio » (
). 
Cliquer sur le bouton « Se conn. ».

Cliquer sur « Nouvelle base de données… ».
Saisir le « Nom de la base de données ». Puis, cliquer sur « OK ».
Sélectionner la base de données créée et cliquer sur « Nouvelle requête » (
). 
Saisir la requête SQL suivante qui est similaire à celle d'insertion du chapitre IV-A avec en plus la création de la table LISTECOURSES.
CREATE TABLE LISTECOURSES (
    IDOBJET INT NOT NULL PRIMARY KEY IDENTITY,
    LIBELLE NVARCHAR(50) NULL,
    QUANTITE INT NULL
);
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Banane', 3); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Sucre blanc', 75); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Oeuf', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Levure', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Sel', 1); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Farine', 150); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Beurre', 70); 
INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES('Cacao', 250);Exécuter la requête en cliquant sur le bouton « Exécuter » (
). 
IV-E. Modification pour utiliser la base en réseau▲
Modifier le code de « liste.aspx.vb » :
Imports System.Data.SqlClient
Public Class liste
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim MyConnexion As SqlConnection = Nothing
        Try
            'MyConnexion = New SqlConnection("Data Source=(LocalDB)\v11.0;" & _
            '                                                     "AttachDbFilename=|DataDirectory|\Database1.mdf;" & _
            '                                                     "Integrated Security=True;")
            MyConnexion = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=dataDev;Integrated Security=True")
            Dim MyCommand As SqlCommand = New SqlCommand("SELECT * FROM LISTECOURSES", MyConnexion)
            MyConnexion.Open()
            Dim MyReader As SqlDataReader = MyCommand.ExecuteReader
            DataGrid.DataSource = MyReader
            DataGrid.DataBind()
        Catch MyException As Exception
            Erreur.Text = MyException.Message
        Finally
            If Not IsNothing(MyConnexion) Then
                If MyConnexion.State = ConnectionState.Open Then
                    MyConnexion.Close()
                End If
            End If
        End Try
    End Sub
End ClassLa seule modification se situe au niveau de la chaine de connexion à la base de données.
Cela donne le résultat suivant :
V. CRÉATION DE DONNÉES EN BASE▲
Le but de ce chapitre est de créer des données dans la base de données depuis l'application. Cela permettra de voir le mécanisme de validation des données provenant du formulaire et la modification des données en base depuis du code VB.Net.
Choisir d'ajouter un fichier de ressources dans le dossier ASP.NET « App_LocalResources ». Le nommer « creation.aspx.resx ». Entrer les valeurs des chaines dans le fichier de ressources.
Créer la page « creation.aspx ».
Modifier le fichier « Web.config » :
<?xml version="1.0" encoding="utf-8"?>
<!--
  Pour plus d'informations sur la configuration de votre application ASP.NET, consultez
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
    <system.web>
      <compilation debug="true" strict="false" explicit="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5"  />
    </system.web>
<appSettings>
    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
  </appSettings>
</configuration>Modifier le code de « creation.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="creation.aspx.vb" Inherits="DeveloppezAspNet.creation" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title><asp:Literal runat="server" Text="<%$ Resources:titre_creation_element_courses %>" /></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table>
            <tr>
                <td colspan="3">
                    <asp:ValidationSummary runat="server" ForeColor="Red" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="TextLibelle" 
                        ForeColor="Red" 
                        Display="Dynamic"
                        ErrorMessage="<%$ Resources:creation_libelle_erreur_obligatoire %>" >*
                    </asp:RequiredFieldValidator>
                </td>
                <td>
                    <asp:Label runat="server" Text="<%$ Resources:creation_element_courses_libelle_libelle %>" /> :
                </td>
                <td>
                    <asp:TextBox ID="TextLibelle" runat="server" Text="" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="TextQuantite" 
                        ForeColor="Red" 
                        Display="Dynamic"
                        ErrorMessage="<%$ Resources:creation_quantite_erreur_obligatoire %>" >*
                    </asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator runat="server" ControlToValidate="TextQuantite"
                        ForeColor="Red"
                        Display="Dynamic"
                        ValidationExpression="[0-9]*"
                        ErrorMessage="<%$ Resources:creation_quantite_erreur_numerique %>" >*
                    </asp:RegularExpressionValidator>
                </td>
                <td>
                    <asp:Label runat="server" Text="<%$ Resources:creation_element_courses_libelle_quantite %>" /> :
                </td>
                <td>
                    <asp:TextBox ID="TextQuantite" runat="server" Text="" />
                </td>
            </tr>
            <tr>
                <td colspan="3">
                    <asp:Button ID="ButtonValider" runat="server" Text="<%$ Resources:creation_element_courses_libelle_valider %>" />
                </td>
            </tr>
        </table>
    </div>
        <div>
            <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
        </div>
        <div>
            <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                    <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                    <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
                </Columns>
            </asp:DataGrid>
        </div>
    </form>
</body>
</html>Dans la page ASP.Net, la balise « asp:ValidationSummary » permet d'afficher les différentes erreurs de validation. Les balises « asp:RequiredFieldValidator » et « asp:RegularExpressionValidator » valident les données du formulaire.
Modifier le code de « creation.aspx.vb » :
Imports System.Data.SqlClient
Public Class creation
    Inherits System.Web.UI.Page
    Private Sub Charger()
        Dim MyConnexion As SqlConnection = Nothing
        Try
            MyConnexion = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=dataDev;Integrated Security=True")
            Dim MyCommand As SqlCommand = New SqlCommand("SELECT * FROM LISTECOURSES", MyConnexion)
            MyConnexion.Open()
            Dim MyReader As SqlDataReader = MyCommand.ExecuteReader
            DataGrid.DataSource = MyReader
            DataGrid.DataBind()
        Catch MyException As Exception
            Erreur.Text = MyException.Message
        Finally
            If Not IsNothing(MyConnexion) Then
                If MyConnexion.State = ConnectionState.Open Then
                    MyConnexion.Close()
                End If
            End If
        End Try
    End Sub
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Charger()
    End Sub
    Private Sub ButtonValider_Click(sender As Object, e As EventArgs) Handles ButtonValider.Click
        Dim MyConnexion As SqlConnection = Nothing
        Try
            MyConnexion = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=dataDev;Integrated Security=True")
            Dim MyCommand As SqlCommand = New SqlCommand("INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES(@Libelle, @Quantite);", MyConnexion)
            MyCommand.Parameters.Add("@Libelle", SqlDbType.NVarChar).Value = TextLibelle.Text
            MyCommand.Parameters.Add("@Quantite", SqlDbType.Int).Value = CInt(TextQuantite.Text)
            MyConnexion.Open()
            MyCommand.ExecuteNonQuery()
            Charger()
        Catch MyException As Exception
            Erreur.Text = MyException.Message
        Finally
            If Not IsNothing(MyConnexion) Then
                If MyConnexion.State = ConnectionState.Open Then
                    MyConnexion.Close()
                End If
            End If
        End Try
    End Sub
End ClassLe code VB.Net utilise une requête paramétrée pour insérer un nouvel enregistrement en base de données.
Cela donne le résultat suivant :
Voici les messages d'erreur lorsque les champs ne sont pas renseignés.
Voici le message d'erreur lorsque le champ numérique n'est pas respecté :
Lorsque les champs sont correctement renseignés, l'application stocke les valeurs et les affiche dans la liste.
VI. SUPPRESSION DE DONNÉES EN BASE▲
Dans ce chapitre, nous réaliserons une page avec un tableau listant les enregistrements de la table avec un bouton permettant de supprimer un de ces enregistrements.
Choisir d'ajouter un fichier de ressources dans le dossier ASP.NET « App_LocalResources ». Le nommer « suppression.aspx.resx ». Entrer les valeurs des chaines dans le fichier de ressources.
Créer la page « suppression.aspx ».
Modifier le code de « suppression.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="suppression.aspx.vb" Inherits="DeveloppezAspNet.suppression" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title><asp:Literal runat="server" Text="<%$ Resources:titre_suppression_element_courses %>" /></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
        </div>
        <div>
            <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                    <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                    <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
                    <asp:ButtonColumn CommandName="Delete" Text="<%$ Resources:suppression_supprimer_libelle %>" />
                </Columns>
            </asp:DataGrid>
        </div>
    </form>
</body>
</html>Dans la page ASP.Net, nous avons encore une petite nouveauté : « asp:ButtonColumn » qui permet d'avoir une colonne avec le bouton de suppression.
Modifier le code de « suppression.aspx.vb » :
Imports System.Web.UI.WebControls
Imports System.Data.SqlClient
Public Class suppression
    Inherits System.Web.UI.Page
    Private Sub Charger()
        Dim MyConnexion As SqlConnection = Nothing
        Try
            MyConnexion = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=dataDev;Integrated Security=True")
            Dim MyCommand As SqlCommand = New SqlCommand("SELECT * FROM LISTECOURSES", MyConnexion)
            Dim MyAdapter As SqlDataAdapter = New SqlDataAdapter(MyCommand)
            Dim MyDataTable As DataTable = New DataTable("LISTECOURSES")
            MyAdapter.Fill(MyDataTable)
            DataGrid.DataSource = MyDataTable
            DataGrid.DataBind()
        Catch MyException As Exception
            Erreur.Text = MyException.Message
        Finally
            If Not IsNothing(MyConnexion) Then
                If MyConnexion.State = ConnectionState.Open Then
                    MyConnexion.Close()
                End If
            End If
        End Try
    End Sub
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Charger()
    End Sub
    Private Sub DataGrid_DeleteCommand(source As Object, e As DataGridCommandEventArgs) Handles DataGrid.DeleteCommand
        Dim item As DataGridItem = CType(e.Item, DataGridItem)
        Dim MyConnexion As SqlConnection = Nothing
        Try
            MyConnexion = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=dataDev;Integrated Security=True")
            Dim MyCommand As SqlCommand = New SqlCommand("SELECT * FROM LISTECOURSES", MyConnexion)
            Dim MyAdapter As SqlDataAdapter = New SqlDataAdapter(MyCommand)
            Dim MyDataTable As DataTable = New DataTable("LISTECOURSES")
            MyAdapter.Fill(MyDataTable)
            Dim IdObjet As Integer = CInt(e.Item.Cells(0).Text)
            Dim MyDataRows As DataRow() = MyDataTable.Select("IDOBJET = " & IdObjet)
            MyDataRows(0).Delete()
            Dim MyCommandBuilder As SqlCommandBuilder = New SqlCommandBuilder(MyAdapter)
            MyAdapter.DeleteCommand = MyCommandBuilder.GetDeleteCommand
            MyAdapter.Update(MyDataTable)
            DataGrid.DataSource = MyDataTable
            DataGrid.DataBind()
        Catch MyException As Exception
            Erreur.Text = MyException.Message
        Finally
            If Not IsNothing(MyConnexion) Then
                If MyConnexion.State = ConnectionState.Open Then
                    MyConnexion.Close()
                End If
            End If
        End Try
    End Sub
End ClassLe code VB.Net utilise une « DataTable » pour manipuler les données. Puis, la suppression est réalisée grâce à un « CommandBuilder » en base de données sans avoir besoin d'utiliser du SQL.
Cela donne le résultat suivant :
Lorsque l'on clique sur un « supprimer » (le dernier dans ce cas), l'application supprime l'enregistrement et affiche le résultat.
VII. MODIFICATION DE DONNÉES EN BASE▲
Dans ce chapitre, nous allons modifier les données en utilisant les possibilités d'édition du contrôle DataGrid et Entity Framework.
Choisir d'ajouter un fichier de ressources dans le dossier ASP.NET « App_LocalResources ». Le nommer « modification.aspx.resx ». Entrer les valeurs des chaines dans le fichier de ressources.
Créer la page « modification.aspx ».
Dans l'« Explorateur de solutions ». Choisir « Ajouter » / « Nouvel élément… ».
Choisir « ADO.NET Entity Data Model ». Saisir le nom du fichier (« DataModel.edmx »). Puis cliquer sur le bouton « Ajouter ».
Cliquer sur « Suivant ».
Cliquer sur le bouton « Nouvelle connexion ».
Entrer les valeurs. Puis, cliquer sur le bouton « OK ».
Saisir « dataEntities ». Puis, cliquer sur le bouton « Suivant ».
Cliquer sur le bouton « Suivant ».
Cocher la table « LISTECOURSES ». Saisir « dataModel ». Puis, cliquer sur le bouton « Suivant ».
Le fichier « DataModel.edmx » contient les tables pour lesquelles une entité a été générée.
Modifier le code de « modification.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="modification.aspx.vb" Inherits="DeveloppezAspNet.modification" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title><asp:Literal runat="server" Text="<%$ Resources:titre_modification_element_courses %>" /></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ValidationSummary runat="server" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" ReadOnly="True" />
                <asp:TemplateColumn HeaderText="<%$ Resources:colonne_libelle %>" >
                    <EditItemTemplate>
                        <asp:TextBox ID="textLibelle" runat="server" Text="<%# Bind('LIBELLE')%>" />
                        <asp:RequiredFieldValidator runat="server" ControlToValidate="textLibelle" 
                            ForeColor="Red" 
                            Display="Dynamic"
                            ErrorMessage="<%$ Resources:modification_libelle_erreur_obligatoire %>" >*
                        </asp:RequiredFieldValidator>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="labelLibelle" runat="server" Text="<%# Bind('LIBELLE')%>" />
                    </ItemTemplate>
                </asp:TemplateColumn>
                <asp:TemplateColumn HeaderText="<%$ Resources:colonne_quantite %>" >
                    <EditItemTemplate>
                        <asp:TextBox ID="textQuantite" runat="server" Text="<%# Bind('QUANTITE')%>" />
                        <asp:RequiredFieldValidator runat="server" ControlToValidate="textQuantite" 
                            ForeColor="Red" 
                            Display="Dynamic"
                            ErrorMessage="<%$ Resources:modification_quantite_erreur_obligatoire %>" >*
                        </asp:RequiredFieldValidator>
                        <asp:RegularExpressionValidator runat="server" ControlToValidate="textQuantite"
                            ForeColor="Red"
                            Display="Dynamic"
                            ValidationExpression="[0-9]*"
                            ErrorMessage="<%$ Resources:modification_quantite_erreur_numerique %>" >*
                        </asp:RegularExpressionValidator>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="labelQuantite" runat="server" Text="<%# Bind('QUANTITE')%>" />
                    </ItemTemplate>
                </asp:TemplateColumn>
                <asp:EditCommandColumn ButtonType="PushButton"
                    EditText="<%$ Resources:modification_element_courses_libelle_modifier %>"
                    UpdateText="<%$ Resources:modification_element_courses_libelle_valider %>"
                    CancelText="<%$ Resources:modification_element_courses_libelle_annuler %>" />
            </Columns>
        </asp:DataGrid>
    </div>
    </form>
</body>
</html>Dans la page ASP.Net, la balise « asp:TemplateColumn » contient les balises « EditItemTemplate » et « ItemTemplate » qui permettent de définir le mode d'édition et d'affichage des valeurs.
Modifier le code de « modification.aspx.vb » :
Public Class modification
    Inherits System.Web.UI.Page
    Private Sub Charger()
        Dim Entities = New dataEntities()
        Dim Query = From Entity In Entities.LISTECOURSES
                    Select Entity
        DataGrid.DataSource = Query.ToList
        DataGrid.DataBind()
    End Sub
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            Charger()
        End If
    End Sub
    Private Sub DataGrid_CancelCommand(source As Object, e As DataGridCommandEventArgs) Handles DataGrid.CancelCommand
        DataGrid.EditItemIndex = -1
        Charger()
    End Sub
    Private Sub DataGrid_EditCommand(source As Object, e As DataGridCommandEventArgs) Handles DataGrid.EditCommand
        DataGrid.EditItemIndex = e.Item.ItemIndex
        Charger()
    End Sub
    Private Sub DataGrid_UpdateCommand(source As Object, e As DataGridCommandEventArgs) Handles DataGrid.UpdateCommand
        DataGrid.EditItemIndex = -1
        Dim IdentifiantText = e.Item.Cells(0).Text
        Dim Identifiant = CType(IdentifiantText, Integer)
        Dim LibelleText = CType(e.Item.Cells(1).Controls(1), TextBox).Text
        Dim QuantiteText = CType(e.Item.Cells(2).Controls(1), TextBox).Text
        Dim Quantite = CType(QuantiteText, Integer)
        Dim Entities = New dataEntities()
        Dim Query = From Entity In Entities.LISTECOURSES
                    Where Entity.IDOBJET = Identifiant
        Dim Course = Query.Single
        Course.LIBELLE = LibelleText
        Course.QUANTITE = Quantite
        Entities.SaveChanges()
        Charger()
    End Sub
End ClassLe code VB.Net contient l'utilisation d'Entity Framework et de LINQ.
Cela donne le résultat suivant :
Voici les messages d'erreur lorsque les champs ne sont pas renseignés :
Voici le message d'erreur lorsque le champ numérique n'est pas respecté :
Lorsque les champs sont correctement renseignés, l'application stocke les nouvelles valeurs et les affiche dans la liste.
VIII. UNIFICATION DE L'APPLICATION PAR UN MENU▲
Dans ce chapitre, nous allons utiliser une page maître afin de réaliser un menu commun à toutes les pages précédemment créées.
Choisir d'ajouter un fichier de ressources dans le dossier ASP.NET « App_GlobalResources ». Le nommer « Titres.resx ». Entrer les valeurs des chaines dans le fichier de ressources.
Dans l'« Explorateur de solutions ». Choisir « Ajouter » / « Nouvel élément… ».
Choisir « Page maître Web Forms ». Saisir le nom du fichier (« Site.Master »). Puis cliquer sur le bouton « Ajouter ».
Modifier le code de « Site.Master » :
<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site.master.vb" Inherits="DeveloppezAspNet.Site" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title><asp:ContentPlaceHolder ID="Titre" runat="server" /></title>
</head>
<body>
    <form id="form1" runat="server">
        <table>
            <tbody>
                <tr>
                    <td valign="top">
                        <table width="150px" border="1">
                            <tbody>
                                <tr>
                                    <td>
                                        <a href="bonjour.aspx"><asp:Literal runat="server" Text="<%$ Resources:Titres, titre_bonjour %>" /></a>
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        <a href="liste.aspx"><asp:Literal runat="server" Text="<%$ Resources:Titres, titre_liste %>" /></a>
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        <a href="creation.aspx"><asp:Literal runat="server" Text="<%$ Resources:Titres, titre_creation %>" /></a>
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        <a href="suppression.aspx"><asp:Literal runat="server" Text="<%$ Resources:Titres, titre_suppression %>" /></a>
                                    </td>
                                </tr>
                                <tr>
                                    <td>
                                        <a href="modification.aspx"><asp:Literal runat="server" Text="<%$ Resources:Titres, titre_modification %>" /></a>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </td>
                    <td valign="top">
                        <asp:ContentPlaceHolder ID="Contenu" runat="server" />
                    </td>
                </tr>
            </tbody>
        </table>
    </form>
</body>
</html>La page maître contient deux balises « asp:ContentPlaceHolder » qui indiquent deux points d'insertion dont le contenu est à définir dans les pages utilisant la page maître. Les différentes pages sont modifiées pour indiquer qu'elles ont une page maître. Elles utilisent la balise « asp:Content » pour déterminer le contenu des points d'insertion.
Modifier le code de « bonjour.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="bonjour.aspx.vb" Inherits="DeveloppezAspNet.bonjour" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:Resource1, titre_bonjour %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <div>
    <asp:Label runat="server" Text="<%$ Resources:Resource1, libelle_bonjour_le_monde %>" />
    </div>
</asp:Content>Modifier le code de « liste.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="liste.aspx.vb" Inherits="DeveloppezAspNet.liste" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:titre_liste_courses %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <div>
        <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
            </Columns>
        </asp:DataGrid>
    </div>
</asp:Content>Modifier le code de « creation.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="creation.aspx.vb" Inherits="DeveloppezAspNet.creation" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:titre_creation_element_courses %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <div>
        <table>
            <tr>
                <td colspan="3">
                    <asp:ValidationSummary runat="server" ForeColor="Red" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="TextLibelle" 
                        ForeColor="Red" 
                        Display="Dynamic"
                        ErrorMessage="<%$ Resources:creation_libelle_erreur_obligatoire %>" >*
                    </asp:RequiredFieldValidator>
                </td>
                <td>
                    <asp:Label runat="server" Text="<%$ Resources:creation_element_courses_libelle_libelle %>" /> :
                </td>
                <td>
                    <asp:TextBox ID="TextLibelle" runat="server" Text="" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="TextQuantite" 
                        ForeColor="Red" 
                        Display="Dynamic"
                        ErrorMessage="<%$ Resources:creation_quantite_erreur_obligatoire %>" >*
                    </asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator runat="server" ControlToValidate="TextQuantite"
                        ForeColor="Red"
                        Display="Dynamic"
                        ValidationExpression="[0-9]*"
                        ErrorMessage="<%$ Resources:creation_quantite_erreur_numerique %>" >*
                    </asp:RegularExpressionValidator>
                </td>
                <td>
                    <asp:Label runat="server" Text="<%$ Resources:creation_element_courses_libelle_quantite %>" /> :
                </td>
                <td>
                    <asp:TextBox ID="TextQuantite" runat="server" Text="" />
                </td>
            </tr>
            <tr>
                <td colspan="3">
                    <asp:Button ID="ButtonValider" runat="server" Text="<%$ Resources:creation_element_courses_libelle_valider %>" />
                </td>
            </tr>
        </table>
    </div>
    <div>
        <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
            </Columns>
        </asp:DataGrid>
    </div>
</asp:Content>Modifier le code de « supression.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="suppression.aspx.vb" Inherits="DeveloppezAspNet.suppression" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:titre_suppression_element_courses %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <div>
        <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
                <asp:ButtonColumn CommandName="Delete" Text="<%$ Resources:suppression_supprimer_libelle %>" />
            </Columns>
        </asp:DataGrid>
    </div>
</asp:Content>Modifier le code de « modification.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="modification.aspx.vb" Inherits="DeveloppezAspNet.modification" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:titre_modification_element_courses %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <div>
        <asp:ValidationSummary runat="server" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" ReadOnly="True" />
                <asp:TemplateColumn HeaderText="<%$ Resources:colonne_libelle %>" >
                    <EditItemTemplate>
                        <asp:TextBox ID="textLibelle" runat="server" Text="<%# Bind('LIBELLE')%>" />
                        <asp:RequiredFieldValidator runat="server" ControlToValidate="textLibelle" 
                            ForeColor="Red" 
                            Display="Dynamic"
                            ErrorMessage="<%$ Resources:modification_libelle_erreur_obligatoire %>" >*
                        </asp:RequiredFieldValidator>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="labelLibelle" runat="server" Text="<%# Bind('LIBELLE')%>" />
                    </ItemTemplate>
                </asp:TemplateColumn>
                <asp:TemplateColumn HeaderText="<%$ Resources:colonne_quantite %>" >
                    <EditItemTemplate>
                        <asp:TextBox ID="textQuantite" runat="server" Text="<%# Bind('QUANTITE')%>" />
                        <asp:RequiredFieldValidator runat="server" ControlToValidate="textQuantite" 
                            ForeColor="Red" 
                            Display="Dynamic"
                            ErrorMessage="<%$ Resources:modification_quantite_erreur_obligatoire %>" >*
                        </asp:RequiredFieldValidator>
                        <asp:RegularExpressionValidator runat="server" ControlToValidate="textQuantite"
                            ForeColor="Red"
                            Display="Dynamic"
                            ValidationExpression="[0-9]*"
                            ErrorMessage="<%$ Resources:modification_quantite_erreur_numerique %>" >*
                        </asp:RegularExpressionValidator>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="labelQuantite" runat="server" Text="<%# Bind('QUANTITE')%>" />
                    </ItemTemplate>
                </asp:TemplateColumn>
                <asp:EditCommandColumn ButtonType="PushButton"
                    EditText="<%$ Resources:modification_element_courses_libelle_modifier %>"
                    UpdateText="<%$ Resources:modification_element_courses_libelle_valider %>"
                    CancelText="<%$ Resources:modification_element_courses_libelle_annuler %>" />
            </Columns>
        </asp:DataGrid>
    </div>
</asp:Content>Cela donne le résultat suivant :
IX. MANIPULATION DES FICHIERS▲
IX-A. Écriture d'un fichier texte▲
Maintenant, nous allons modifier la page d'affichage des données de la base pour ajouter un bouton qui crée un fichier contenant la liste de ces données.
Ajouter la correspondance suivante dans « liste.aspx.resx » (Clic droit sur le fichier puis « Ouvrir avec… » / « Éditeur XML (Texte) avec encodage ») :
  <data name="creation_fichier" xml:space="preserve">
    <value>Création d'un fichier avec la liste</value>
  </data>Modifier le code de « liste.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="liste.aspx.vb" Inherits="DeveloppezAspNet.liste" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:titre_liste_courses %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <div>
        <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
            </Columns>
        </asp:DataGrid>
    </div>
    <asp:Label runat="server" ID="Message" /><br />
    <asp:Button runat="server" ID="Creation" Text="<%$ Resources:creation_fichier %>" />
</asp:Content>Modifier le code de « liste.aspx.vb » pour ajouter la méthode suivante :
    Private Sub Creation_Click(sender As Object, e As EventArgs) Handles Creation.Click
        Dim Dossier = System.IO.Path.GetTempPath
        Dim SousDossier = Dossier & "fic\"
        If Not IO.Directory.Exists(SousDossier) Then
            IO.Directory.CreateDirectory(SousDossier)
        End If
        Dim Fichier = SousDossier & "fichier.txt"
        Dim Stream As IO.StreamWriter = New IO.StreamWriter(Fichier, False)
        Message.Text = "Création du fichier à l'emplacement " & Fichier
        Dim MyConnexion As SqlConnection = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=dataDev;Integrated Security=True")
        Dim MyCommand As SqlCommand = New SqlCommand("SELECT * FROM LISTECOURSES", MyConnexion)
        MyConnexion.Open()
        Dim MyReader As SqlDataReader = MyCommand.ExecuteReader
        If MyReader.HasRows Then
            Do While MyReader.Read
                Stream.WriteLine(MyReader.GetInt32(0) & " - " & MyReader.GetString(1) & " : " & MyReader.GetInt32(2))
            Loop
        End If
        MyConnexion.Close()
        Stream.Close()
    End SubDans la méthode appelée lors du clic du bouton, on retrouve des classes du namespace « System.IO ». « Path » permet de retrouver le dossier temporaire, « Directory » de manipuler des sous-dossiers et « StreamWriter » d'écrire dans le fichier.
Cela donne le résultat suivant :
Lorsque l'on clique sur le bouton, le chemin de stockage du fichier sur le serveur apparaît.
Le fichier « fichier.txt » contient ceci :
1 - Banane : 30
2 - Sucre blanc : 75
3 - Oeuf : 1
4 - Levure : 1
5 - Sel : 1
6 - Farine : 150
7 - Beurre : 70
8 - Cacao : 250IX-B. Lecture d'un fichier texte▲
Dans ce chapitre, nous allons relire le fichier créé dans le chapitre précédent pour le proposer au téléchargement grâce à un bouton.
Ajouter la correspondance suivante dans « liste.aspx.resx » :
  <data name="lecture_fichier" xml:space="preserve">
    <value>Téléchargement du fichier avec la liste</value>
  </data>Modifier le code de « liste.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="liste.aspx.vb" Inherits="DeveloppezAspNet.liste" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:titre_liste_courses %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <div>
        <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
            </Columns>
        </asp:DataGrid>
    </div>
    <asp:Label runat="server" ID="Message" /><br />
    <asp:Button runat="server" ID="Creation" Text="<%$ Resources:creation_fichier %>" />
    <asp:Button runat="server" ID="Lecture" Text="<%$ Resources:lecture_fichier %>" />
</asp:Content>Modifier le code de « liste.aspx.vb » pour ajouter la méthode suivante :
    Private Sub Lecture_Click(sender As Object, e As EventArgs) Handles Lecture.Click
        Dim Dossier = System.IO.Path.GetTempPath
        Dim SousDossier = Dossier & "fic\"
        Dim Fichier = SousDossier & "fichier.txt"
        If IO.File.Exists(Fichier) Then
            Dim Stream As IO.StreamReader = New IO.StreamReader(Fichier)
            Dim Info As System.IO.FileInfo = New System.IO.FileInfo(Fichier)
            Response.Clear()
            Response.AddHeader("Content-Disposition", "attachment; filename=fichier.txt")
            Response.AddHeader("Content-Length", Info.Length.ToString())
            Response.ContentType = "application/octet-stream"
            Dim Ligne As String = Stream.ReadLine
            Do While Not Ligne Is Nothing
                Response.Write(Ligne & vbCrLf)
                Ligne = Stream.ReadLine
            Loop
            Stream.Dispose()
            Stream.Close()
            Response.End()
        Else
            Message.Text = "Le fichier " & Fichier & " n'existe pas : il faut le créer au préalable"
        End If
    End SubOn retrouve des classes du namespace « System.IO ». Cette fois-ci, nous utilisons la classe « StreamReader » pour lire le fichier. L'objet implicite « Response » (il est une instance de HttpResponse, il n'est pas déclaré dans le code, mais il est utilisable) permet d'envoyer le contenu du fichier au navigateur).
Cela donne le résultat suivant :
Lorsque l'on clique sur le bouton de téléchargement, cela donne ceci :
Lorsque l'on clique sur le bouton de téléchargement après avoir créé le fichier, on obtient le résultat suivant :
X. AMÉLIORATION PAR LES AJAX CONTROLS▲
Dans ce chapitre, nous allons faire appel à contrôle Ajax pour bloquer la saisie de caractères alphabétiques dans le champ de « quantité ».
Faire un clic droit dans « Boîte à outils ». Puis choisir « Ajouter un onglet ».
Nommer ce nouvel onglet.
Faire un clic droit dans « Boîte à outils ». Puis choisir « Choisir les éléments… ».
Cliquer sur le bouton « Parcourir ».
Sélectionner le fichier « AjaxControlToolkit.dll » contenu dans l'archive d'Ajax Control Toolkit (décompresser l'archive au préalable).

Les nouveaux contrôles ont été ajoutés. Cliquer sur le bouton « OK ».
Modifier le code de « creation.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="creation.aspx.vb" Inherits="DeveloppezAspNet.creation" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:titre_creation_element_courses %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <ajax:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"></ajax:ToolkitScriptManager>
    <div>
        <table>
            <tr>
                <td colspan="3">
                    <asp:ValidationSummary runat="server" ForeColor="Red" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="TextLibelle" 
                        ForeColor="Red" 
                        Display="Dynamic"
                        ErrorMessage="<%$ Resources:creation_libelle_erreur_obligatoire %>" >*
                    </asp:RequiredFieldValidator>
                </td>
                <td>
                    <asp:Label runat="server" Text="<%$ Resources:creation_element_courses_libelle_libelle %>" /> :
                </td>
                <td>
                    <asp:TextBox ID="TextLibelle" runat="server" Text="" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:RequiredFieldValidator runat="server" ControlToValidate="TextQuantite" 
                        ForeColor="Red" 
                        Display="Dynamic"
                        ErrorMessage="<%$ Resources:creation_quantite_erreur_obligatoire %>" >*
                    </asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator runat="server" ControlToValidate="TextQuantite"
                        ForeColor="Red"
                        Display="Dynamic"
                        ValidationExpression="[0-9]*"
                        ErrorMessage="<%$ Resources:creation_quantite_erreur_numerique %>" >*
                    </asp:RegularExpressionValidator>
                </td>
                <td>
                    <asp:Label runat="server" Text="<%$ Resources:creation_element_courses_libelle_quantite %>" /> :
                </td>
                <td>
                    <asp:TextBox ID="TextQuantite" runat="server" Text="" />
                    <ajax:FilteredTextBoxExtender ID="FiltreTextQuantite" TargetControlID="TextQuantite" FilterType="Numbers" runat="server" />
                </td>
            </tr>
            <tr>
                <td colspan="3">
                    <asp:Button ID="ButtonValider" runat="server" Text="<%$ Resources:creation_element_courses_libelle_valider %>" />
                </td>
            </tr>
        </table>
    </div>
    <div>
        <asp:Label ID="Erreur" runat="server" Font-Bold="true" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" />
                <asp:BoundColumn DataField="LIBELLE" HeaderText="<%$ Resources:colonne_libelle %>" />
                <asp:BoundColumn DataField="QUANTITE" HeaderText="<%$ Resources:colonne_quantite %>" ItemStyle-HorizontalAlign="Right" />
            </Columns>
        </asp:DataGrid>
    </div>
</asp:Content>Modifier le code de « modification.aspx » :
<%@ Page Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="modification.aspx.vb" Inherits="DeveloppezAspNet.modification" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>
<asp:Content runat="server" ID="Titre" ContentPlaceHolderID="Titre">
    <asp:Literal runat="server" Text="<%$ Resources:titre_modification_element_courses %>" />
</asp:Content>
<asp:Content runat="server" ID="Contenu" ContentPlaceHolderID="Contenu">
    <ajax:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"></ajax:ToolkitScriptManager>
    <div>
        <asp:ValidationSummary runat="server" ForeColor="Red" />
    </div>
    <div>
        <asp:DataGrid ID="DataGrid" runat="server" BorderWidth="1" GridLines="Both" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundColumn DataField="IDOBJET" HeaderText="<%$ Resources:colonne_identifiant %>" ReadOnly="True" />
                <asp:TemplateColumn HeaderText="<%$ Resources:colonne_libelle %>" >
                    <EditItemTemplate>
                        <asp:TextBox ID="textLibelle" runat="server" Text="<%# Bind('LIBELLE')%>" />
                        <asp:RequiredFieldValidator runat="server" ControlToValidate="textLibelle" 
                            ForeColor="Red" 
                            Display="Dynamic"
                            ErrorMessage="<%$ Resources:modification_libelle_erreur_obligatoire %>" >*
                        </asp:RequiredFieldValidator>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="labelLibelle" runat="server" Text="<%# Bind('LIBELLE')%>" />
                    </ItemTemplate>
                </asp:TemplateColumn>
                <asp:TemplateColumn HeaderText="<%$ Resources:colonne_quantite %>" >
                    <EditItemTemplate>
                        <asp:TextBox ID="textQuantite" runat="server" Text="<%# Bind('QUANTITE')%>" />
                        <asp:RequiredFieldValidator runat="server" ControlToValidate="textQuantite" 
                            ForeColor="Red" 
                            Display="Dynamic"
                            ErrorMessage="<%$ Resources:modification_quantite_erreur_obligatoire %>" >*
                        </asp:RequiredFieldValidator>
                        <asp:RegularExpressionValidator runat="server" ControlToValidate="textQuantite"
                            ForeColor="Red"
                            Display="Dynamic"
                            ValidationExpression="[0-9]*"
                            ErrorMessage="<%$ Resources:modification_quantite_erreur_numerique %>" >*
                        </asp:RegularExpressionValidator>
                        <ajax:FilteredTextBoxExtender ID="FiltreTextQuantite" TargetControlID="textQuantite" FilterType="Numbers" runat="server" />
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="labelQuantite" runat="server" Text="<%# Bind('QUANTITE')%>" />
                    </ItemTemplate>
                </asp:TemplateColumn>
                <asp:EditCommandColumn ButtonType="PushButton"
                    EditText="<%$ Resources:modification_element_courses_libelle_modifier %>"
                    UpdateText="<%$ Resources:modification_element_courses_libelle_valider %>"
                    CancelText="<%$ Resources:modification_element_courses_libelle_annuler %>" />
            </Columns>
        </asp:DataGrid>
    </div>
</asp:Content>Dorénavant, il n'est plus possible de saisir de texte dans les champs « quantité » de la page de création et de modification.
Il est nécessaire d'ajouter la balise « ajax:ToolkitScriptManager » pour que les contrôles Ajax fonctionnent. La balise « ajax:FilteredTextBoxExtender » filtre le champ « quantité » pour que seuls les nombres soient saisissables.
Il aurait également été possible d'ajouter le tag « ToolkitScriptManager » dans la page maître « Site.Master ».
XI. CONCLUSION▲
Cet article ne présente pas de conseils sur l'organisation des sources d'une application. Il présente simplement quelques techniques.
Pour aller plus loin, je vous conseille de regarder du côté de MVC avec ASP.Net.
XII. REMERCIEMENTS▲
Je remercie très sincèrement :
- www.developpez.com qui me permet de publier cet article ;
 - Nono40 et djibril pour leurs outils ;
 - yahiko pour sa relecture technique ;
 - Claude LELOUP pour sa relecture orthographique rigoureuse.
 





























































































