Cette page uniquementToutes les pages
Propulsé par GitBook
1 sur 8

Développement de formulaires Web WorkflowGen avec Visual Studio

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Développement de formulaires Web WorkflowGen avec Visual Studio

Ce guide fournit des instructions sur la création de formulaires Web pour WorkflowGen à l'aide de .NET Framework 4 et de l'assembly WorkflowGen.My. L'assembly WorkflowGen.My est conçu pour encapsuler toutes les communications entre l'application de workflow EFORMASPX et vos formulaires Web, afin que vous puissiez vous concentrer sur le développement de formulaires Web.

Aperçu des formulaires Web

EFORMASPX

L'application de workflow EFORMASPX agit comme un pont entre les formulaires Web .NET et WorkflowGen, et vous permet d'utiliser des formulaires Web pour modifier vos données de processus. Voir la section Application de workflow EFORMASPX dans le Guide d'administration WorkflowGen pour des informations sur les paramètres EFORMASPX et leur usage.

Procédures de lancement et de soumission des formulaires Web

La procédure de lancement du formulaire Web est la suivante :

  1. WorkflowGen envoie le contexte de la demande à EFORMASPX.

  2. EFORMASPX intègre les paramètres WorkflowGen dans le fichier XML de données de formulaire, puis envoie la demande au formulaire Web.

  3. La superclasse WorkflowPage encapsule tout le travail qui doit être effectué pour récupérer les données du formulaire à partir du chemin de stockage EFORMASPX.

La procédure de soumission du formulaire Web est la suivante :

  1. WorkflowGen obtient le contexte et met à jour.

  2. EFORMASPX récupère le fichier dataOUT.xml, met à jour le fichier context.xml avec les nouvelles données, puis renvoie le contexte à WorkflowGen.

  3. WorkflowPage écrit form_archive.htm et dataOUT.xml

Données de formulaire

Les données de formulaire doivent être un DataSet ou un XmlDocument utilisé pour stocker toutes les valeurs de champ de formulaire Web et les paramètres IN, OUT et/ou INOUT dans WorkflowGen. Ces données de formulaire peuvent être modifiées via le formulaire Web, puis transmises à EFORMASPX par le WorkflowPage. Ces données de formulaire sont accessibles dans chaque action EFORMASPX dans le paramètre obligatoire FORM_DATA.

Archive de formulaire

L'archive de formulaire est une vue statique d'une seule action terminée, généralement stockée dans le fichier form_archive.htm et accessible dans la donnée FORM_ARCHIVE de WorkflowGen pour chaque action contenant le paramètre FORM_ARCHIVE.

Cette archive de formulaire est automatiquement créée à chaque action par WorkflowPage. Vous pouvez décider si vous souhaitez ou non qu'il soit référencé dans l'une de vos données de workflow.

La disposition de l'archive de formulaire peut être personnalisée en redéfinissant simplement la méthode qui modifie la disposition de l'archive de formulaire dans la classe WorkflowPage.

Paramètres d'action

Les paramètres d'action par défaut des actions EFORMASPX sont les suivants :

Chemin de stockage

Le chemin de stockage est l'emplacement où EFORMASPX stocke tous ses fichiers temporaires avant leur transfert vers WorkflowGen. Ce chemin est unique pour chaque instance de formulaire Web. Les fichiers suivants sont stockés par EFORMASPX dans le chemin de stockage :

  • context.xml

  • result.xml

  • session.xml

La propriété du chemin de stockage de WorkflowPage vous donne accès à ce répertoire, mais vous ne devez jamais utiliser ces fichiers directement. Le but de ce chemin de stockage est de stocker des fichiers temporaires.

La meilleure pratique consiste à toujours créer un sous-répertoire dans ce chemin de stockage si vous souhaitez stocker quelque chose temporairement.

Les fichiers de pièces jointes seront automatiquement enregistrés dans le sous-répertoire de téléchargement si vous utilisez les méthodes fournies pour cette tâche.

Connexions à la base de données

Si vous avez des contrôles Web ou du code-behind lié à une base de données, il est fortement recommandé d'utiliser un nom de connexion plutôt qu'une chaîne de connexion pour simplifier la gestion multi-environnement. Les noms de connexion sont gérés de manière centralisée dans le fichier web.config de WorkflowGen.

Prérequis

Prérequis techniques

  • WorkflowGen 7 ou version ultérieure

  • WorkflowGen.My 4.x

  • .NET Framework 4.6.1 (.NET Framework et ASP.NET 4.7.2 sont supportés pour l'exécution et le développement de formulaires Web)

Assembly WorkflowGen.My

Pour implémenter un formulaire Web, vous devez avoir WorkflowGen.My référencé dans votre projet. Suivez ces instructions pour référencer directement un assembly dans votre projet Web :

  1. Créez un répertoire \bin sous le dossier racine de votre site Web (par exemple \wfgen\wfapps\webforms\MyWebForm.bin).

  2. Copiez le fichier WorkflowGen.My.dll dans ce dossier.

  3. Faites un clic droit sur le nom de votre projet et choisissez Ajouter une référence...

WorkflowGen.My est maintenant référencé dans votre projet.

Configuration Web

WorkflowPage n'utilise aucun paramètre web.config particulier.

Données de formulaire XML

Les données de formulaire sont contenues le fichier XML utilisé pour stocker toutes vos données de formulaire Web. Un élément de données de type fichier appelé FORM_DATA doit être créé et laissé vide.

Fichiers et dossiers

Vos styles CSS doivent être situés dans un sous-répertoire appelé \css, et votre fichier de feuille de style d'archive de formulaire doit être appelé form_archive.css car WorkflowPage recherchera ce fichier particulier à cet emplacement pour le trouver.

Si vous ne souhaitez pas utiliser ces valeurs par défaut, vous pouvez toujours modifier la propriété FormArchiveCssPath, dont la valeur par défaut est \css\form_archive.css.

Un fichier d'archive de formulaire appelé form_archive.htm sera créé par défaut, mais vous pouvez utiliser le nom de votre choix en modifiant la valeur de la propriété FormArchiveFileName.

Mode AJAX

Formulaires ASPX personnalisés en mode AJAX

Si vous développez un formulaire ASPX personnalisé en mode AJAX, procédez comme suit :

  1. Dans l'élément <form runat="server", ajoutez un ScriptManager

Cliquez sur Parcourir.

  • Accédez au répertoire \bin que vous venez de créer et choisissez le fichier WorkflowGen.My.dll, puis cliquez sur OK.

  • au début du formulaire et encapsulez tout le contenu du formulaire dans le
    contenttemplate
    d'un
    UpdatePanel
    .

    📌 Exemple

  • Étant donné que les contrôles FileUpload standard ne sont pas supportés dans le UpdatePanel, utilisez le contrôle WorkflowFileUpload pour vos besoins en pièces jointes.

  • Ajoutez la ligne suivante dans le constructeur de page pour éviter un problème pouvant survenir lors de la mise à jour d'une ligne dans un GridView :

    Vous ne verrez aucune différence au moment de l'exécution mais cela permet d'empêcher un évènement de postback lorsque vous cliquez sur le bouton Mettre à jour et que la validation échoue. Le UpdatePanel empêche déjà l'évènement de postback.

  • Enregistrez les déclencheurs de postback dans l'événement Page_Load ou directement dans la page ASPX pour chacun de vos contrôles qui effectue un postback ou une soumission vers WorkflowGen.

    Pour ce faire dans l'évènement Page_Load:

    Pour ce faire dans la page ASPX:

    1. Ajouter un élément <Triggers> dans le UpdatePanel.

    2. Ajouter un élément <asp:PostBackTrigger ControlID="MyControlID" /> pour chacun des contrôles nécessitant un déclenchement de postback.

  •  this.UseClientSideOptimization = false;
     ScriptManager.GetCurrent(this).RegisterPostBackControl(MyControlID);      
    <form id="form1" name="form1" runat="server">
        <asp:scriptmanager id="ScriptManager1" runat="server"></asp:scriptmanager>
        <asp:updatepanel id="UpdatePanel1" runat="server">
            <contenttemplate>
                ... contenu du formulaire ...
            </contenttemplate>
        </asp:updatepanel>
    </form>
    Le développeur peut se concentrer sur les fonctionnalités de son formulaire Web et ignorer les transferts entre EFORMASPX et le formulaire Web.
    dans le chemin de stockage EFORMASPX.
  • Le formulaire Web appelle la méthode SubmitToWorkflow() de WorkflowPage.

  • WorkflowGen obtient le contexte et met à jour.

  • Liste des champs masqués dans le formulaire d'action

    FORM_ARCHIVE

    OUT

    Contient le fichier form_archive.htm

    CURRENT_ACTION

    IN

    Habituellement, ce paramètre utilise une macro qui doit contenir le nom de l'action actuelle

    PARAMS_XPATH

    IN

    Si vous utilisez le mais que vous ne souhaitez pas utiliser la structure NewDataSet/Table1 dans vos données de formulaire, vous pouvez spécifier une expression XPath personnalisée qui pointe vers la table de paramètres dans votre paramètre FORM_DATA

    dataIN.xml
  • dataOUT.xml

  • Paramètre

    Direction

    Description

    FORM_FIELDS_READONLY

    IN

    Liste des champs à rendre en lecture seule

    FORM_FIELDS_REQUIRED

    IN

    Liste des champs obligatoires

    FORM_FIELDS_HIDDEN

    IN

    Liste des champs masqués

    FORM_FIELDS_ARCHIVE_HIDDEN

    IN

    mode avancé

    Référence de classe WorkflowPage

    Méthodes accessibles

    void FillFormData(DataSet ou XmlDocument)

    Utilisez cette méthode pour charger le fichier XML de données de formulaire temporaire (dataOUT.xml) à partir du répertoire de travail de l'action en cours dans le paramètre IN form data. Vous pouvez utiliser un DataSet ou un objet XmlDocument pour recevoir les données du formulaire.

    Référez-vous à la propriété de classe de WorkflowPage pour l'emplacement du répertoire de travail de l'action en cours.

    S'il y a déjà des données dans votre DataSet ou XmlDocument, les données seront vidées avant d'être remplies.

    void SaveFieldsData(DataSet)

    Cette méthode tentera de trouver des contrôles dans la page qui ont le même ID que les colonnes dans Table1 de vos données de formulaire. Lorsqu'il en trouve un, il met à jour la valeur des données du formulaire avec la valeur du contrôle.

    Si la propriété DataType de la colonne en cours de remplissage est Date ou Double, le type de données de la valeur du formulaire Web sera validé et formaté à l'aide du code de culture actuel avant d'être poussé dans le DataSet. Si la valeur n'est pas cohérente avec le type de données, une exception FormatException est lancée avec un message approprié vous indiquant quel champ n'est pas une date valide ou une valeur double.

    Pour un contrôle FileUpload ou HtmlInputFile, seul le nom du fichier est poussé dans l'ensemble de données, vous devez donc toujours appeler la méthode SaveFileAttachment afin d'enregistrer le fichier dans le chemin de stockage EFORMASPX.

    Pour utiliser cette méthode, vous devez utiliser un DataSet comme source de données de formulaire.

    Si un ListBox avec mode de sélection multiple ou un CheckBoxList est trouvé pour les données d'un formulaire, la valeur sera toutes les valeurs sélectionnées (ou cochées) séparées par des virgules.

    Les contrôles Web suivants sont supportés :

    • TextBox

    • Label

    • DropDownList

    void BindFormDataToFields(DataSet, bool isPageDataBind = true)

    Utilisez cette méthode lorsque vous souhaitez lier automatiquement tous vos champs de formulaire Web à l'aide de votre DataSet de données de formulaire. Les contrôles supportés sont exactement les mêmes que ceux supportés par la méthode SaveFieldsData.

    Définissez le paramètre isPageDataBind sur false si vous souhaitez ignorer l'appel de Page.DataBind() au début de cette méthode. Sinon, par défaut, un Page.DataBind() est appelé au début pour s'assurer que les autres contrôles sont liés avant de lier vos propres contrôles de formulaire Web.

    Dans certains cas, un appel à l'événement de liaison de données de page peut ne pas être souhaité (p.ex. sauter la liaison de données de page qui a déjà été effectuée auparavant), ou si vous souhaitez contrôler exactement quand exécuter l'événement de liaison de données de page à la place.

    void SaveFormData(DataSet ou XmlDocument)

    Utilisez cette méthode pour écrire un form data dans le fichier XML de données de formulaire temporaire (dataOUT.xml) dans le répertoire de travail de l'action en cours. Vous pouvez utiliser un DataSet ou un objet XmlDocument pour mettre à jour le fichier XML de données de formulaire.

    void SaveFormData (DataSet, bool saveFieldValues)

    Utilisez cette méthode pour enregistrer les valeurs de champ de formulaire Web dans des données de formulaire (saveFieldValues défini sur true), puis pour écrire les données de formulaire dans le fichier XML de données de formulaire temporaire (dataOUT.xml) dans le répertoire de travail de l'action en cours.

    Cette surcharge de méthode n'est disponible que si votre form data est un objet DataSet.

    Vous devez définir le paramètre saveFieldValuessur true si vous souhaitez enregistrer l'état actuel des valeurs de champ de formulaire Web dans form data. Cela assurera que les valeurs des données du formulaire sont synchronisées avec les valeurs des champs du formulaire Web avant toute manipulation du formulaire Web ou des données du formulaire.

    Par exemple, il est nécessaire d'enregistrer les valeurs du champ du formulaire Web lors de l'injection de données personnalisées dans les données du formulaire avant de recharger le formulaire Web à l'aide de la méthode BindFormDataToFields. Sinon, l'état actuel des valeurs des champs de formulaire Web pourrait être perdu après l'actualisation.

    void SubmitToWorkflow()

    Utilisez cette méthode lorsque vous souhaitez soumettre le formulaire Web à WorkflowGen et le rediriger du formulaire Web vers WorkflowGen.

    void SubmitToWorkflow(isDraftMode)

    Utilisez cette méthode lorsque vous souhaitez soumettre le formulaire Web à WorkflowGen et le rediriger du formulaire Web vers WorkflowGen en mode DRAFT (isDraftMode défini sur true). Cela ignorera tous les champs obligatoires, y compris les GridViews. (Cette méthode est disponible depuis la version 2.2.5 de WorkflowGen.My.)

    void SubmitToWorkflow(DataSet or XmlDocument)

    Utilisez cette méthode lorsque vous souhaitez soumettre le formulaire Web à WorkflowGen, enregistrer les données de votre formulaire et rediriger du formulaire Web vers WorkflowGen.

    Cette surcharge de méthode n'est disponible que si les données de votre formulaire sont un objet DataSet.

    void SubmitToWorkflow(DataSet, Boolean saveFieldValues)

    Utilisez cette méthode lorsque vous souhaitez soumettre le formulaire Web à WorkflowGen, enregistrer les valeurs de vos champs dans vos données de formulaire (saveFieldValues défini sur true), enregistrer vos données de formulaire, puis rediriger du formulaire Web vers WorkflowGen.

    string SaveFileAttachment(HttpPostedFile)

    Utilisez cette méthode lorsque vous souhaitez enregistrer une pièce jointe dans le chemin de stockage de EFORMASPX dans un sous-répertoire appelé upload. Cette méthode renvoie le nom du fichier.

    string SaveFileAttachment (HttpPostedFile, string)

    Utilisez cette méthode lorsque vous souhaitez enregistrer une pièce jointe dans le chemin de stockage de EFORMASPX dans un sous-répertoire appelé upload et que vous souhaitez spécifier un nom de fichier à utiliser. Cette méthode renvoie le nom du fichier.

    Méthodes substituables

    string GetFormArchive()

    Remplacez cette méthode si vous souhaitez personnaliser la sortie de l'archive de formulaire. Cette méthode doit renvoyer une page HTML complète.

    void ChangeFormArchiveLayout()

    Remplacez cette méthode afin de personnaliser la mise en page de l'archive de formulaire.

    void ChangeFormLayout()

    Remplacez cette méthode afin de personnaliser la mise en page de votre formulaire Web.

    Propriétés

    string CurrentWorkflowActionName (lecture seule)

    • Le nom de l'action WorkflowGen actuelle

    • Il sera vide si vous n'avez pas ajouté de paramètre CURRENT_ACTION à votre action.

    string LangId (lecture seule)

    • Le code de culture actuel de l'utilisateur WorkflowGen connecté

    • Exemple de code de culture : fr-FR

    string StoragePath (lecture seule)

    • Le chemin absolu vers le dossier de stockage temporaire du répertoire de travail de l'action en cours. Il est utilisé pour lire et écrire les données du formulaire et pour enregistrer les pièces jointes.

    • Exemple de valeur : DISQUE:\inetpub\wwwroot\wfgen\App_Data\Files\EFORMASPX

    string RequiredFieldsErrorMessage (lecture et écriture)

    • Le message d'erreur pour les champs obligatoires

    • Valeur par défaut : Le champ {0} est obligatoire

    • Cette valeur doit contenir {0} et contiendra le nom du champ.

    string FormArchiveFileName (lecture et écriture)

    • Le nom du fichier d'archive du formulaire

    • Valeur par défaut : form_archive.htm

    string FormArchiveCssPath (lecture et écriture)

    • Le chemin d'accès relatif à la feuille de style de l'archive de formulaire

    • Valeur par défaut : \css\form_archive.css

    Color ReadOnlyFieldsBorderColor (lecture et écriture)

    • Couleur de bordure ou couleur du texte du champ en lecture seule s'il s'agit d'une liste déroulante, d'une liste de cases à cocher ou d'une liste de boutons radio

    • Si la couleur est Color.Empty, la couleur ne sera pas affectée.

    • Valeur par défaut : Color.Empty

    Color RequiredFieldsBorderColor (lecture et écriture)

    • Couleur de bordure ou couleur du texte du champ requis s'il s'agit d'une liste déroulante, d'une liste de cases à cocher ou d'une liste de boutons radio

    • Si la couleur est Color.Empty, la couleur ne sera pas affectée.

    • Valeur par défaut : Color.Red

    ColorizationType FieldsColorization (lecture et écriture)

    • Le type de colorisation pour les champs obligatoires, en lecture seule et modifiables

    • Valeurs possibles : Automatic, Css, None

    • Valeur par défaut : Automatic

    Boolean IsStandAloneMode (lecture seule)

    • Cette propriété indique si le formulaire Web s'exécute ou non en mode autonome.

    • L'exécution en mode autonome signifie que le formulaire Web n'a pas été instancié par WorkflowGen, mais plutôt en appelant l'adresse du formulaire Web directement sans aucun paramètre WorkflowGen.

    Boolean IsSimpleMode (lecture et écriture)

    • Cette propriété détermine si vous exécutez WorkflowPage en mode avancé ou simple.

    • Cette propriété doit être déterminée dans le constructeur du formulaire Web.

    • Valeur par défaut : true

    Boolean HandleSubmitButton (lecture et écriture)

    • Cette propriété détermine si WorkflowPage gère automatiquement le bouton d'envoi avec l'ID SubmitButton. Si la propriété est définie sur true, vous n'avez pas à gérer le code SubmitButton.

    • Cette propriété doit être déterminée dans le constructeur du formulaire Web.

    • Cette propriété n'est disponible qu'en mode simple.

    DataSet FormData (lecture seule)

    • Cette propriété contient le DataSet des données de formulaire géré par WorkflowPage si vous êtes en mode simple.

    • Cette propriété n'est disponible qu'en mode simple.

    string RequiredGridViewsErrorMessage (lecture et écriture)

    • Le message d'erreur affiché à l'utilisateur final lorsqu'un GridView requis n'a pas encore été rempli.

    • Valeur par défaut : The {0} list needs to have at least one filled row.

    • Cette valeur doit contenir {0}; ce symbole contiendra le nom du champ.

    string InvalidNumberGridViewErrorMessage (lecture et écriture)

    • Le message d'erreur affiché à l'utilisateur final lorsqu'un champ numérique n'a pas été rempli avec une valeur numérique valide dans un GridView.

    • Valeur par défaut : You have entered an invalid number in the {0} column.

    • Cette valeur doit contenir {0}; ce symbole contiendra le nom du champ.

    string InvalidCurrencyGridViewsErrorMessage (lecture et écriture)

    • Le message d'erreur affiché à l'utilisateur final lorsqu'un champ numérique n'a pas été rempli avec une valeur de devise valide dans un GridView

    • Valeur par défaut : You have entered an invalid number in the {0} column. Do not enter the currency symbol in the value.

    • Cette valeur doit contenir {0}; ce symbole contiendra le texte d'en-tête de colonne.

    string RequiredColumnsInGridViewsErrorMessage (lecture et écriture)

    • Le message d'erreur affiché à l'utilisateur final lorsqu'une colonne requise n'a pas été remplie dans un GridView et que l'utilisateur final tente de mettre à jour la ligne

    • Valeur par défaut : The {0} column is required.

    • Cette valeur doit contenir {0}; ce symbole contiendra le texte d'en-tête de colonne.

    string InvalidDateGridViewErrorMessage (lecture et écriture)

    • Le message d'erreur affiché à l'utilisateur final lorsqu'une date ou un champ de date/heure dans un GridView n'a pas été rempli avec une valeur de date ou de date/heure valide

    • Valeur par défaut : You have entered an invalid date in the {0} column.

    • Cette valeur doit contenir {0}; ce symbole contiendra le nom du champ.

    boolean ColorizeRequiredColumnsInGridViewHeader (lecture et écriture)

    • Si cette propriété est définie sur true, les en-têtes de colonne requis dans les GridViews auront leur propriété ForeColor affectée par la couleur RequiredFieldsBorderColor.

    • Valeur par défaut : false

    string InvalidNumberErrorMessage (lecture et écriture)

    • Le message d'erreur affiché à l'utilisateur final lorsqu'un champ numérique n'a pas été rempli avec une valeur numérique valide

    • Valeur par défaut : You have entered an invalid number in the {0} field.

    • Cette valeur doit contenir {0}; ce symbole contiendra le nom du champ.

    string InvalidCurrencyErrorMessage (read and write)

    • Le message d'erreur affiché à l'utilisateur final lorsqu'un champ numérique n'a pas été rempli avec une valeur de devise valide.

    • Valeur par défaut : You have entered an invalid number in the {0} field. Do not enter the currency symbol in the value.

    • Cette valeur doit contenir {0}; ce symbole contiendra le nom du champ.

    string InvalidDateErrorMessage (lecture et écriture)

    • Le message d'erreur affiché à l'utilisateur final lorsqu'une date ou un champ de date/heure n'a pas été rempli avec une valeur de date ou de date/heure valide.

    • Valeur par défaut : You have entered an invalid date in the {0} field.

    • Cette valeur doit contenir {0}; ce symbole contiendra le nom du champ.

    string ParamsXPath (lecture seule)

    • La valeur du paramètre ParamsXPath que vous avez passé dans l'action WorkflowGen.

    • Valeur par défaut : NewDataSet/Table1

    boolean IsSessionLess (lecture et écriture)

    • Si cette propriété est définie sur true, le ViewState sera utilisé pour stocker tous les paramètres internes de WorkflowPage au lieu d'utiliser la Session.

    • Valeur par défaut : false

    • Cette propriété doit être déterminée dans le constructeur du formulaire Web.

    boolean SaveFormDataWithSchema (lecture et écriture)

    • Si cette propriété est définie sur false, le FormData sera enregistré sans son schéma.

    • Valeur par défaut : true

    • Cette propriété doit être déterminée dans le constructeur du formulaire Web.

    boolean RemoveValidatorsInFormArchive (lecture et écriture)

    • Si cette propriété est définie sur true, tous les validateurs seront automatiquement masqués dans l'archive de formulaire.

    • Valeur par défaut : true

    boolean ValidateRequiredFields (lecture et écriture)

    • Si cette propriété est définie sur false, toutes les validations des champs obligatoires seront désactivées à l'exception des champs obligatoires dans les contrôles GridView.

    • Valeur par défaut : true

    • Cette propriété doit être modifiée avant l'événement OnLoadComplete de la page.

    ViewState et Session

    WorkflowPage utilise ViewState ou Session, selon la propriété IsSessionLess, pour stocker les paramètres EFORMASPX qu'il reçoit et pour stocker d'autres paramètres internes qu'il doit conserver, donc le ViewState ou la Session du formulaire Web ne doivent jamais être désactivés afin d'utiliser WorkflowPage.

    Veillez à ne jamais utiliser les noms de variables ViewState ou Session suivants :

    • WFGEN_INSTANCE_PATH

    ListBox
  • CheckBox

  • CheckBoxList

  • RadioButton

  • RadioButtonList

  • FileUpload

  • HtmlInputFile

  • Dans la plupart des scénarios, nous suggérons de définir le paramètre saveFieldValues sur true avant toute manipulation susceptible de modifier le formulaire Web ou les données du formulaire.

    Valeur par défaut : true

    Cette propriété doit être déterminée dans le constructeur du formulaire Web.

  • Cette propriété n'est disponible qu'en mode simple.

  • WFGEN_STORAGE_PATH
  • WFGEN_REPLY_TO

  • WFGEN_CURRENT_ACTION

  • WFGEN_IS_STAND_ALONE

  • WFGEN_GRID_VIEW_INSERTING

  • WFGEN_GRID_VIEW_SHOW_CANCEL

  • WFGEN_PARAMS_XPATH

  • WFGEN_BACKUP_CONTROL_FORECOLOR

  • WFGEN_BACKUP_CONTROL_BORDERCOLOR

  • WFGEN_BACKUP_CONTROL_BACKCOLOR

  • WFGEN_BACKUP_CONTROL_BORDERWIDTH

  • WFGEN_BACKUP_CONTROL_CSSSTYLE

  • WFGEN_BACKUP_CONTROL_CSSCLASS

  • WFGEN_ALL_SIMPLE_MODE_TABLES

  • WFGEN_ALL_SUPPORTED_CONTROLS

  • WFGEN_USER_TZ

  • WFGEN_SIMPLE_MODE_DATASET_STRUCTURE

  • WFGEN_VALIDATE_REQUIRED_FIELDS

  • USER_LANG

  • StoragePath
    protected void Page_Load(object sender, System.EventArgs e)
    {
         // ...
         
         // Remplissez vos données de formulaire
         FillFormData(formData);
         
         // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
    
        // Enregistrer les pièces jointes dans le chemin de stockage EFORMASPX
        this.SaveFileAttachment(TEST_UPLOAD.PostedFile);
    
        // Mettre à jour automatiquement les données du formulaire
        // avec les valeurs des champs du formulaire Web
        this.SaveFieldsData(formData);
    
        // ...
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        // ...
    
        // Lier les contrôles de formulaire Web avec les données du formulaire
        // lors du chargement de la première page
        if (!Page.IsPostBack)
        {
            BindFormDataToFields(formData);
        }
        
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
        
        // Habituellement, vous souhaiterez enregistrer les données de
        // votre formulaire avant de soumettre
        this.saveFormData(formData);
    
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
    
        // Habituellement, vous souhaiterez enregistrer les données de
        // votre formulaire avant de soumettre
        this.SaveFormData(formData, true);
    
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
    
        // Soumet tout au workflow et crée automatiquement
        // l'archive de formulaire si nécessaire.
        this.SubmitToWorkflow();
        
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
    
        // Soumet tout au workflow et crée automatiquement
        // l'archive de formulaire si nécessaire.
        this.SubmitToWorkflow(true);
        
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
    
        // Soumet tout au workflow et crée automatiquement
        // l'archive de formulaire si nécessaire.
        this.SubmitToWorkflow(formData);
        
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
    
        // ...
    
        // Soumet tout au workflow et crée automatiquement
        // l'archive de formulaire si nécessaire.
        this.SubmitToWorkflow(formData, true);
        
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
    
    
        // Enregistrer la pièce jointe dans EFORMASPX
        SaveFileAttachment(TEST_UPLOAD.PostedFile);
    
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
    
        // Enregistrez la pièce jointe dans EFORMASPX
       SaveFileAttachment(TEST_UPLOAD.PostedFile, "fileName.ext");
    
        // ...
    }
    protected override string GetFormArchive()
    {
        StringBuilder htmlContent = new StringBuilder();
    
        // Créez le code HTML de votre choix dans l'objet htmlContent
        // ...
        
        return htmlContent.ToString();
    }
    protected override void ChangeFormArchiveLayout()
    {
        // Effectuez des traitements personnalisés ici
        // ...
    
        // Assurez-vous d'appeler la base ChangeFormArchiveLayout si vous voulez
        // champs soient automatiquement mis en lecture seule et masquer les champs
        // qui sont répertoriés dans FORM_ARCHIVE_HIDDEN_FIELDS
    
        base.ChangeFormArchiveLayout();
    }
    protected override void ChangeFormLayout()
    {
        // Assurez-vous d'appeler le ChangeFormLayout de base avant de faire quoi que ce soit d'autre
        // car si vous l'appelez à la fin, vous remplacerez vos modifications personnalisées.
        base.ChangeFormArchiveLayout();    
    
        // Effectuez des traitements personnalisés ici
        // p.ex. :
        if (CurrentWorkflowActionName == "ACTION_NAME1")
        {
            // ...
        }
        else if (CurrentWorkflowActionName == "ACTION_NAME2")
        {
            // ...
        }
    }
    if (CurrentWorkflowActionName == "ACTION_NAME")
    {
        // ...
    }
    if (LangId == "fr-FR")
    {
        // Faites un traitement spécifique à la culture ...
    }
    FileStream myfs = new FileStream(this.StoragePath + "\\signedXml.xml",
    FileMode.Create, FileAccess.ReadWrite);
    this.RequiredFieldsErrorMessage = Resources.Strings.RequiredErrorMessage;
    this.FormArchiveFileName = "my_form_archive.htm";
    this.ReadOnlyFieldsBorderColor = Color.Green;
    this.RequiredFieldsBorderColor = Color.Orange;
    this.FieldsColorization = Fields.ColorizationType.Css;
    if (!this.IsStandAloneMode) 
    {
        Page.DataBind();
    }
    this.IsSimpleMode = false;
    this.HandleSubmitButton = false;
    FormData.Tables["Table1"].Rows[0]["REQUEST_DATE"] = DateTime.Now.ToString();
    this.RequiredGridViewsErrorMessage =
     Resources.Strings.RequiredGridViewsErrorMessage;
    this.InvalidNumberGridViewErrorMessage =
     Resources.Strings.InvalidNumberGVErrMsg;
    this.InvalidCurrencyGridViewsErrorMessage =
     Resources.Strings.InvalidCurrGVErrMsg;
    this.RequiredColumnsInGridViewsErrorMessage =
     Resources.Strings.RequiredColInGV;
    this.InvalidDateGridViewErrorMessage = Resources.Strings.InvalidDateGVErrMsg;
    this.ColorizeRequiredColumnsInGridViewHeader = true;
    this.InvalidNumberErrorMessage = Resources.Strings.InvalidNumberErrMsg;
    this.InvalidCurrencyErrorMessage = Resources.Strings.InvalidCurrencyErrMsg;
    this.InvalidDateErrorMessage = Resources.Strings.InvalidDateErrMsg;
    this.IsSessionLess = true;
    this.SaveFormDataWithSchema = false;
    this.RemoveValidatorsInFormArchive = true;
    this.ValidateRequiredFields = false;

    Développement de formulaires Web : Mode avancé

    Aperçu

    Le mode avancé est spécialement conçu pour les développeurs en offrant un contrôle total sur tous les aspects d'un formulaire Web. Cela permet une plus grande flexibilité et offre plus de possibilités pour les fonctions pouvant entrer dans le formulaire Web.

    Création de l'application Web

    Outils de développement suggérés

    • Visual Web Developer Express 2015 ou version supérieure

    • Visual Studio 2015 ou version supérieure

    Répertoire d'installation des formulaires Web

    Nous vous suggérons fortement de stocker tous vos formulaires Web dans le répertoire \wfgen\wfapps\webforms (p.ex. : \wfgen\wfapps\webforms\MonFormulaireWeb).

    Notez que si vous modifiez votre processus WorkflowGen et que vous devez modifier le MonFormulaireWeb associé en raison de ces modifications, vous devez au préalable dupliquer MonFormulaireWeb, puis créer une autre application IIS. Sinon, les deux versions du processus utiliseront le même MonFormulaireWeb modifié.

    Créez l'application dans IIS

    L'application du formulaire Web doit être déclarée en tant qu'application dans IIS pour être reconnue en tant qu'application de formulaire Web .NET. Suivez ces instructions pour déclarer votre répertoire de formulaires Web en tant qu'application IIS :

    Pour IIS 7 ou version ultérieure

    1. Ouvrez Gestionnaire IIS.

    2. Accédez à l'emplacement de votre formulaire Web, qui doit se trouver dans le nœud Site Web par défaut sous \wfgen\wfapps\webforms\MonFormulaireWeb.

    3. Faites un clic droit sur MonFormulaireWeb et choisissez Convertir en application.

    Création du projet avec Visual Studio

    Créez le projet

    1. Ouvrez Visual Studio et sélectionnez Fichier > Nouveau site Web.

    2. Choisissez Site Web ASP.NET.

    3. Choisissez Système de fichiers dans la liste déroulante Emplacement.

    Créez un DataSet typé

    Vous devrez créer un nouvel élément DataSet dans votre projet et y ajouter un DataTable Table1. Suivez ces étapes afin d'ajouter un nouveau DataSet dans votre projet Web :

    1. Faites un clic droit sur votre projet et sélectionnez Ajouter un nouvel élément...

    2. Choisissez DataSet, puis cliquez sur Ajouter.

    3. Une fenêtre contextuelle apparaîtra vous demandant de choisir une connexion de données; cliquez sur Annuler car un DataSet ne peut pas être attaché à une source de données spécifique (il sera à la place envoyé dynamiquement lors de l'exécution).

    Obtenir des messages d'erreur détaillés

    Par défaut, vous n'aurez aucun fichier web.config dans votre projet Web si vous utilisez C# comme langage de développement dans l'IDE de Microsoft Visual Studio. Pour afficher des messages d'erreur complets lorsque vous souhaitez déboguer, vous devez disposer d'un fichier web.config. Pour ajouter un fichier web.config par défaut à votre projet, procédez comme suit :

    1. Faites un clic droit sur le nom de votre projet, puis cliquez sur Ajouter un nouvel élément...

    2. Choisissez Fichier de configuration Web, puis cliquez sur OK.

    Afin de pouvoir voir les messages d'erreur complets, modifiez les propriétés suivantes dans le fichier web.config :

    1. Assurez-vous que cette ligne est définie sur "true" :

    2. Assurez-vous que le suivant n'est pas commenté et que la propriété mode est définie sur "Off" :

    Implémentation de base

    Référence

    Vous devez ajouter une référence à WorkflowGen.My.dll dans votre projet Web, puis ajouter cette instruction au début de votre formulaire Web :

    Héritage de classe

    Votre formulaire Web doit hériter de la classe WorkflowPage contenue dans l'espace de noms WorfklowGen.My.Web.UI.WebForms.

    Utilisation du mode avancé

    Lorsque vous utilisez le mode avancé de WorkflowPage, vous devez spécifier que vous n'utilisez pas le mode simple. Utilisez le code suivant pour ce faire :

    Méthode Page_Load

    La première chose à faire dans la méthode Page_Load est d'appeler la méthode FillFormData() pour remplir les données dans vos données de formulaire. La Page_Load est également l'endroit où apporter des modifications aux propriétés de WorkflowPage. Vous pouvez donner un DataSet ou un XmlDocument à la méthode FillFormData().

    Enregistrement des données de formulaire

    Les données de formulaire doivent être enregistrées sur toute publication (« postback ») qui modifie les données du formulaire. Si vous ne l'enregistrez pas avant la fin de la publication, toutes les modifications seront perdues car la méthode FillFormData() dans l'événement Page_Load remplacera les modifications avec les anciennes données.

    Pour enregistrer vos données de formulaire dans EFORMASPX, vous devez appeler la méthode SaveFormData() à partir de WorkflowPage. Vous pouvez attribuer un DataSet ou un XmlDocument à la méthode SaveFormData().

    Mise à jour des données de formulaire avec les valeurs du formulaire Web

    Vous souhaiterez généralement mettre à jour vos données de formulaire avec les valeurs du formulaire Web avant de soumettre les données du formulaire à WorkflowGen. Cela peut être fait pour tous les champs qui sont liés dans le Table1 de vos données de formulaire en appelant la méthode SaveFieldsData(DataSet). La méthode essaiera de trouver des contrôles dans la page qui ont les mêmes IDs que les colonnes Table1, et lorsqu'elle en trouve un, elle met à jour la valeur de la donnée de formulaire avec la valeur du contrôle.

    Cette méthode supporte uniquement les DataSet. Les champs qui sont mis à jour doivent se trouver dans une table nommée Table1.

    Soumission au workflow

    Une fois qu'il est temps de tout soumettre au workflow (via EFORMASPX), vous devez appeler la méthode WorkflowPageSubmitToWorkflow(). Cette méthode doit recevoir vos données de formulaire si vous souhaitez les enregistrer en même temps. Vous pouvez également séparer manuellement ces appels en appelant SubmitToWorkflow sans aucun paramètre; cependant, si vous faites cela, les données de votre formulaire ne seront pas mises à jour si vous n'appelez pas explicitement SaveFormData(formData) avant de soumettre.

    Gestion de la validation des champs

    Aperçu

    WorkflowPage crée automatiquement des contrôles RequiredFieldValidator dans votre page pour valider les champs qui ont été écrits dans le paramètre FORM_FIELDS_REQUIRED dans toutes vos actions EFORMASPX. Ces validations peuvent être placées sur l'un des types de contrôle suivants :

    • TextBox

    • RadioButtonList

    • DropDownList

    Si vous souhaitez avoir un message personnalisé, vous devez modifier la propriété RequiredFieldsErrorMessage. Assurez-vous d'avoir le symbole {0} dans votre message personnalisé. Si vous ne placez pas de balise {0} quelque part dans votre message, une exception sera levée car il ne serait pas logique d'avoir une liste de champs obligatoires sans savoir quels champs doivent être remplis.

    Les contrôles RequiredFieldValidator qui sont créés ont leurs propriétés ValidationGroup définies sur WFGENPage. Cela signifie que la validation de ces validateurs ne sera effectuée que si le contrôle qui déclenche la validation a sa propriété ValidationGroup définie sur la même valeur. Par défaut, si vous avez un contrôle bouton SubmitButton dans votre page, son ValidationGroup est automatiquement modifié. Si vous utilisez un autre identifiant pour le bouton de soumission, vous devez définir vous-même le ValidationGroup, sinon les champs obligatoires ne seront pas validés comme prévu lors de la soumission de la page.

    Validation du type de données

    Lorsque vous spécifiez le type de données d'un champ à l'aide de l'attribut FieldDataType, des validateurs sont automatiquement insérés dans votre page pour valider les types de données Date et Numeric.

    • Les champs de type DATE sont validés à l'aide d'un RangeValidator avec la propriété MinimumValue définie sur DateTime.MinimumValue et la propriété MaximumValue définie sur DateTime.MaximumValue.

    • Les champs de type NUMERIC sont validés à l'aide d'un RangeValidator avec la propriété MinimumValue

    Les contrôles RangeValidator ont la convention d'affectation de noms suivante : WFGEN_RV_FIELD_ID.

    Si vous créez vos propres contrôles RangeValidator pour valider les champs sur lesquels vous avez défini l'attribut FieldDataType, WorkflowPage ne crée pas automatiquement de RangeValidator pour ces champs.

    Les contrôles RangeValidator qui sont créés ont leurs propriétés ValidationGroup définies sur WFGENPage. Cela signifie que la validation de ces validateurs ne sera effectuée que si le contrôle qui déclenche la validation a sa propriété ValidationGroup définie sur la même valeur. Par défaut, si vous avez un contrôle bouton SubmitButton dans votre page, son ValidationGroup est automatiquement modifié. Si vous utilisez un autre identifiant pour le bouton de soumission, vous devez définir vous-même le ValidationGroup, sinon les champs ne seront pas validés comme prévu lors de la soumission de la page.

    Validation personnalisée

    Si vous souhaitez effectuer vos propres validations personnalisées, vous pouvez toujours créer vos contrôles RequiredFieldValidator ou RangeValidator sur les champs où vous avez spécifié l'attribut FieldDataType, et WorkflowPage ne créera pas automatiquement des contrôles RequiredFieldValidator ou RangeValidator pour ces contrôles particuliers.

    Si vous souhaitez effectuer plus de validations sur l'un de vos champs à l'aide d'autres validateurs .NET (tels que les contrôles CompareValidator, CustomValidator ou RegularExpressionValidator), vous devrez modifier les propriétés ValidationGroup de ces validateurs en WFGENPage, sinon la validation ne sera pas effectuée pour les contrôles ciblés lors de la soumission du formulaire.

    📌 Exemple

    Champs en lecture seule

    Aperçu

    WorkflowPage peut automatiquement rendre certains champs en lecture seule ou désactivés (selon les types de contrôle) pour les champs du paramètre FORM_FIELDS_READONLY. Les types de contrôle suivants seront définis en lecture seule ou désactivés s'ils se trouvent dans FORM_FIELDS_READONLY :

    • TextBox

    • RadioButton

    • RadioButtonList

    Gestion de la colorisation des champs

    Aperçu

    WorkflowPage modifie automatiquement l'apparence des contrôles FORM_FIELDS_REQUIRED et FORM_FIELDS_READONLY en fonction de sa propriété FieldsColorization.

    La propriété FieldsColorization est une instance d'une énumération qui peut avoir les valeurs suivantes :

    • Automatic

    • CSS

    • None

    Mode Automatic

    Le mode Automatic utilise les propriétés suivantes pour coloriser les champs :

    • RequiredFieldsBorderColor

    • ReadOnlyFieldsBorderColor

    Certains types de contrôle ont leurs bordures colorisées tandis que d'autres ont leurs couleurs de texte modifiées (pour des raisons esthétiques).

    Les contrôles suivants verront leur couleur de texte (propriété ForeColor) modifiée si la couleur n'est pas Color.Empty dans leurs propriétés correspondantes :

    • DropDownList

    • CheckBoxList

    • RadioButtonList

    Les autres contrôles verront leurs couleurs de bordure modifiées si la couleur n'est pas Color.Empty dans leurs propriétés correspondantes.

    Mode CSS

    Au lieu de modifier directement le style, le mode CSS modifie les propriétés CssClass des contrôles comme indiqué dans l'exemple ci-dessous, ce qui vous donne beaucoup plus de flexibilité pour avoir l'apparence exacte que vous souhaitez dans votre formulaire Web.

    📌 Exemple

    • Si TextBox1 a sa propriété CssClass définie sur FieldValueCell et qu'il s'agit d'un champ obligatoire, CssClass1 sera remplacé par FieldValueCell-required.

    • Si TextBox1 n'a pas de propriété CssClass, CssClass

    Mode None

    Le mode None ne modifiera la couleur ou le style des contrôles de votre formulaire Web. Ce mode désactive complètement la colorisation automatique ou la colorisation CSS.

    Gestion de l'archive de formulaire

    Feuille de style CSS

    Vous pouvez personnaliser l'apparence de votre archive de formulaire à l'aide du fichier form_archive.css.

    Vos styles CSS doivent être situés dans un sous-répertoire appelé \css et votre fichier de feuille de style d'archive de formulaire doit être appelé form_archive.css, car WorkflowPage recherchera cet emplacement particulier et ce nom de fichier pour le trouver, puis remplacera les styles d'archive de formulaire par les styles contenus dans ce fichier.

    Si ces valeurs par défaut ne sont pas celles que vous souhaitez utiliser, vous pouvez toujours modifier la propriété FormArchiveCssPath, dont la valeur par défaut est \css\form_archive.css. Si aucun fichier form_archive.css n'est créé, l'archive de formulaire aura la même apparence que le formulaire Web, mais les champs seront tous définis en lecture seule ou désactivés.

    Masquer les champs

    Par défaut, le bouton dans votre page avec l'ID SubmitButton sera automatiquement masqué dans l'archive de formulaire.

    Si vous souhaitez masquer d'autres champs dans l'archive de formulaire, utilisez le paramètre FORM_FIELDS_ARCHIVE_HIDDEN. Les contrôles répertoriés dans ce paramètre seront automatiquement masqués lors de la création de l'archive de formulaire.

    Les contrôles qui ne sont pas runat=server dans votre formulaire Web ne seront pas masqués.

    Vous voudrez parfois personnaliser la mise en page du formulaire archivé. Pour ce faire, vous devrez remplacer la méthode WorkflowPage ChangeFormArchiveLayout().

    Si vous voulez encore plus de flexibilité avec la création d'archives de formulaires, vous pouvez remplacer la méthode GetFormArchive(). Cette méthode doit renvoyer une chaîne contenant le HTML de l'archive de formulaire.

    Gestion des pièces jointes

    Lorsque vous avez un contrôle FileUpload dans votre formulaire Web, vous souhaiterez utiliser la méthode SaveFileAttachment() dans WorkflowPage. Cette méthode est utilisée pour enregistrer le fichier dans le sous-répertoire \upload dans le chemin de stockage EFORMASPX et récupérer le nom de fichier du fichier publié.

    Si vous avez plusieurs pièces jointes en une seule action, vous devez envisager de renommer les fichiers publiés manuellement, car si l'utilisateur envoie deux fichiers différents portant le même nom, les fichiers se remplaceront. Pour enregistrer la pièce jointe avec un nom spécifié, utilisez la méthode surchargée SaveFileAttachment().

    Gestion des ressources

    Ajouter des ressources à votre projet Web

    1. Faites un clic droit sur la racine de votre site Web, puis sélectionnez Ajouter un nouvel élément...

    2. Choisissez Fichier de ressources et entrez le nom souhaité pour votre fichier de ressources.

    3. Cliquez sur Ajouter. Ce fichier contiendra les ressources par défaut pour votre formulaire Web (en-US).

    Lorsque vous souhaitez utiliser les ressources dans votre formulaire Web, il vous suffit d'utiliser l'espace de noms System.Resources, et toutes vos ressources seront automatiquement fortement typées. Cela signifie que vous pouvez accéder à tout le contenu de vos fichiers de ressources avec des propriétés d'objet.

    Gestion du GridView

    Aperçu

    Cette section explique comment utiliser un GridView en mode avancé.

    DataTable

    La première chose que vous devez faire est d'ajouter un DataTable au DataSet de vos données de formulaire qui représente les données gérées du GridView.

    Il est important que ce DataTable ait une clé primaire.

    Objet métier

    Vous devez maintenant concevoir un objet métier qui encapsulera les opérations possibles sur votre DataTable. Voici un exemple d'objet métier pour le DataTable PEOPLE_LIST :

    ObjectDataSource

    L'étape suivante consiste à placer un ObjectDataSource dans votre page et à le lier à votre objet métier. Pour ce faire :

    1. Glissez-déplacez l'ObjectDataSource sur votre formulaire Web en mode Création.

    2. Cliquez sur Configurer la source de données.

    3. Choisissez l'objet métier que vous avez créé précédemment.

    GridView

    1. Glissez-déplacez un GridView sur le formulaire Web, choisissez l'ObjectDataSource que vous avez créé à l'étape précédente comme DataSource et vérifiez les opérations que vous souhaitez activer dans votre GridView. (Voir ci-dessous pour des instructions sur comment activer l'insertion dans un GridView.)

    2. Définissez la propriété DataKeyNames si vous souhaitez activer la modification et l'insertion dans votre GridView.

    3. Il est recommandé de définir le champ ID

    Activation de l'insertion dans le GridView

    La solution de contournement pour l'insertion dans un GridView consiste à ajouter un bouton pour insérer manuellement une nouvelle ligne dans le DataTable PEOPLE_LIST lorsque quelqu'un clique dessus. Pour ce faire :

    1. Glissez-déplacez un LinkButton sous votre GridView, puis double-cliquez sur le LinkButton et ajoutez-y le code suivant:

    2. Ce code ne supporte pas la pagination et le tri, vous devrez donc détecter vous-même le nouvel EditIndex si vous souhaitez activer la pagination et le tri dans votre GridView. Cela est dû au fait que le EditIndex n'est pas nécessairement le PEOPLE_LIST.Rows.Count - 1 lorsque vous utilisez ces fonctions.

    Mise à jour des données de votre formulaire OnRowDeleted et OnRowUpdated

    La dernière étape consiste à définir les événements OnRowDeleted et OnRowUpdated pour que GridView mette à jour vos données de formulaire à chaque modification. Pour ce faire, ajoutez le code suivant :

    Personnalisation du schéma FormData et séparation des données de formulaire des paramètres de formulaire

    Personnalisation du schéma FormData

    Dans la section précédente, vous avez été invité à placer tous les paramètres et vos données de formulaire dans le même DataTable nommé Table1, mais vous pouvez toujours utiliser un autre nom de DataSet et un autre nom de DataTable si vous le souhaitez.

    Notez, cependant, que si vous n'utilisez pas le nom Table1 pour le DataTable, vous devez utiliser le paramètre PARAMS_XPATH dans toutes vos actions pour indiquer à EFORMASPX et WorkflowPage où ils doivent localiser les paramètres et les données du formulaire. Ce paramètre est un XPath qui pointe vers cette table. Si vous nommez votre DataSet MyFormData et que vous nommez votre table par défaut MyParameters, le paramètre PARAMS_XPATH doit contenir MyFormData/MyParameters, sinon votre processus ne fonctionnera pas.

    Lorsque vous définissez un schéma personnalisé de cette façon, vous devez également inclure un fichier modèle FORM_DATA dans votre projet avec le même schéma vide :

    Séparation des données de formulaire des paramètres de formulaire

    Vous pouvez séparer les paramètres d'action de vos données de formulaire, mais vous devrez utiliser l'emplacement XPath complet de vos données de formulaire comme nom de paramètre si vous souhaitez les utiliser comme paramètres d'action. Par exemple, si vous avez un champ nommé REQUEST_FIRSTNAME dans votre formulaire Web et que vous souhaitez placer ces données dans une autre table (p.ex. MyData), vous déclarez le paramètre avec le nom /MesDonnnéesFormulaire/MesDonnées/REQUEST_FIRSTNAME.

    Notez que si vous utilisez des expressions XPath personnalisées pour vos noms de paramètres d'action, vous devrez également télécharger un FORM_DATA personnalisé dans votre processus qui contient des nœuds vides pour ces paramètres.

    Voici un exemple complet d'action de processus qui utiliserait des DataTables séparés pour les paramètres et pour les données du formulaire :

    Structure de DataSet

    Paramètres d'action

    Utilisation des UserControls Web dans les formulaires Web

    Si vous prévoyez d'utiliser des UserControls pour encapsuler certaines parties de vos formulaires Web qui seront répétées d'un formulaire Web à un autre, vous pouvez les utiliser avec WorkflowGen.My.

    Vous devez disposer des informations suivantes pour les utiliser correctement :

    • Pour chaque contrôle présent dans le UserControl, WorkflowGen.My créera un nœud dans Table1 du jeu de donnée FormData, préfixé par l'ID du contrôle utilisateur dans la page. Par exemple, si vous avez un UserControl dans votre page avec l'ID HEADER_UC qui contient une zone de texte avec l'ID FIRST_NAME, le champ sera accessible via FormData avec le nom HEADER_UC.FIRST_NAME.

    • Si vous souhaitez accéder à ce champ via un paramètre WorkflowGen, vous devrez utiliser cette convention pour accéder au champ. Si vous souhaitez utiliser une macro qui envoie le prénom de l'utilisateur dans le champ HEADER_UC.FIRST_NAME

    Sélectionnez le pool d'applications utilisé par votre site et un autre pool d'applications spécifique.

  • Cliquez sur OK.

  • Cliquez sur Parcourir, puis choisissez l'emplacement de votre site Web ASP.NET.
  • Cliquez sur OK.

  • Faites un clic droit dans l'espace vide et sélectionnez Ajouter > DataTable.

  • Renommez DataTable1 en Table1.

  • Ajoutez tous vos noms de champ de formulaire et les paramètres IN, OUT et INOUT en tant que colonnes dans ce tableau.

    ✏️ Note : Il est nécessaire de reconstruire votre formulaire Web chaque fois que vous modifiez cette définition de DataSet.

  • Ajoutez une variable DataSet à votre code Default.aspx.cs et instanciez-la dans le constructeur par défaut de votre classe. Si votre nom de classe est Form, le code ressemblera à ceci pour l'instant :

  • ListBox
  • FileUpload

  • HtmlInputFile

  • définie sur
    Double.MinimumValue
    et la propriété
    MaximumValue
    définie sur
    Double.MaximumValue
    .
    CheckBox
  • CheckBoxList

  • DropDownList

  • ListBox

  • FileUpload

  • HtmlInputFile

  • sera remplacé par
    Required
    .

    Ajoutez un fichier de ressources pour chaque langue que vous souhaitez gérer pour votre formulaire Web. Le nom de fichier doit se terminer par culture-code.resx. 📌 Exemple : Strings.fr-FR.resx serait le nom de fichier de la langue française de France.

    Sélectionnez la méthode appropriée pour chaque opération de données.​​

    ​​ ✏️ Note : Le GridView n'a pas les fonctions intégrées pour supporter les opérations d'insertion, nous allons donc utiliser la section UPDATE afin d'insérer des éléments. Ne choisissez aucune méthode pour la section INSERT.

  • Cliquez sur Terminer.

  • Ajoutez l'événement ObjectCreating pour gérer la création de l'ObjectDataSource avec la classe de l'objet métier.

  • en lecture seule en cliquant sur
    Modifier les colonnes...
    et en définissant la propriété
    ReadOnly
    du champ lié à l'ID sur
    True
    .
    , vous devrez utiliser ce nom comme nom de paramètre dans le paramètre d'action WorkflowGen.
  • Si vous souhaitez définir un champ situé dans un UserControl pour qu'il soit considéré comme requis par WorkflowGen.My, vous utilisez toujours la convention ci-dessus pour répertorier ce champ dans le paramètre FORM_FIELDS_REQUIRED.

  • Activation de l'insertion dans le GridView
    public partial class Form : WorkflowGen.My.Web.UI.WebForms.WorkflowPage
    {
     protected DataSet1 formData;
    
     public Form() : base()
     {
         formData = new DataSet1();
     }
    protected void PeopleListObjectDataSource_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
        {
        // Attachez l'instance de PEOPLE_LIST à
        // PeopleListObjectDataSource
        e.ObjectInstance = new PeopleListBusinessObject(formData.PEOPLE_LIST);
        }
    <compilation debug="true" />
    <customErrors mode="Off" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
    using WorkflowGen.My.Web.UI.WebForms;
    public partial class Form : WorkflowGen.My.Web.UI.WebForms.WorkflowPage
    {
        protected DataSet1 formData;
    
        public Form() : base()
        {
    
    // Définissez la propriété SimpleMode sur False pour utiliser le mode avancé
        IsSimpleMode = false;
        formData = new DataSet1();
        }
    }
    protected void Page_Load(object sender, System.EventArgs e)
    {
        // Remplissez vos données de formulaire ici
        FillFormData(formData);
    
        // Liez les données du formulaire aux champs du formulaire Web. (Ce n'est pas obligatoire,
        // cela dépend de la manière dont vous souhaitez gérer les données de votre formulaire)
    
    if (!Page.IsPostBack)
        {
    
    BindFormDataToFields(formData);
        }
    
        // Tout traitement supplémentaire ira ici
        // ...
    }
    protected void AnyServerSideEventModifyingFormData(object sender, ...)
    {
        // Modifiez les données du formulaire ...
        formData.Tables["TableExpense"].Rows.RemoveAt(e.Item.ItemIndex);
    
        // Reliez le(s) contrôle(s) pour voir les modifications sur le formulaire Web
        DataList1.DataBind();
    
        // Enregistrez les données du formulaire
            this.SaveFormData(formData);
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // Mettre à jour automatiquement les données du formulaire avec les valeurs du formulaire Web
        this.SaveFieldsData(formData);
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
    
    // Tout traitement avant de soumettre va ici (p.ex. : validation,
    // modification des données etc.)
        // ...
    
        // Soumet tout au workflow et crée l'archive de formulaire si
        // nécessaire.
        this.SubmitToWorkflow(formData);
    }
    <asp:RegularExpressionValidator ID="RegValidatorExample" runat="server"
    ErrorMessage="Votre message d'erreur" ControlToValidate="VotreContrôle"
    Display="Dynamic" ValidationGroup="WFGENPage" ValidationExpression="\w+([-
    +.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
    </asp:RegularExpressionValidator>
    protected override void ChangeFormArchiveLayout()
    {
        // Effectuez des traitements personnalisés ici
        // ...
    
        // Assurez-vous d'appeler la base ChangeFormArchiveLayout si vous souhaitez
        // que les champs soient automatiquement mis en lecture seule et masquer
        // les champs répertoriés dans FORM_FIELDS_ARCHIVE_HIDDEN
        base.ChangeFormArchiveLayout();
    }
    protected override string GetFormArchive()
    {
        // Construisez le html de l'archive de formulaire
        
        // ...
    
        // Renvoyer le résultat html
    
    return htmlResult;
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
        // ...
    
        // Enregistrez la pièce jointe dans EFORMASPX et mettez à jour
        // le nom du fichier dans les données du formulaire
        formData.Tables["Table1"].Rows[0]["TEST_UPLOAD"] = 
    SaveFileAttachment(TEST_UPLOAD.PostedFile);
    
        // ...
    }
    protected void Submit_Click(object sender, System.EventArgs e)
    {
    
    // ...
    
        // Enregistrez la pièce jointe dans EFORMASPX et mettez à jour
        // le nom du fichier dans les données du formulaire
        formData.Tables["Table1"].Rows[0]["TEST_UPLOAD"] = 
    SaveFileAttachment(TEST_UPLOAD.PostedFile,
    "NomDeFichierQueVousChoisissez.ext");
    
        // ...
    }
    public class PeopleListBusinessObject
    {
        // Référence au DataTable people_list
        private FormData.PEOPLE_LISTDataTable peopleListTable;
    
        /// <summary>
        /// Constructeur qui affecte la référence de la table peopleListTable
        /// </summary>
        /// <param name="peopleListDataTable">The reference we need to populate our
        /// business object</param>
        public PeopleListBusinessObject(FormData.PEOPLE_LISTDataTable
    peopleListDataTable)
        {
            peopleListTable = peopleListDataTable;
        }
    
        /// <summary>
        /// Returns the PeopleListDataTable, will be used by the ObjectDataSource
        /// </summary>
        /// <returns>A PEOPLE_LISTDataTable</returns>
        public FormData.PEOPLE_LISTDataTable GetPeopleList()
        {
            return peopleListTable;
        }
    
        /// <summary>
        /// Inserts / updates data into the PEOPLE_LIST DataTable, will be used by the
        /// ObjectDataSource
        /// </summary>
        /// <param name="ID">The Person ID</param>
        /// <param name="firstName">First name of the person</param>
        /// <param name="lastName">Last name of the person</param>
        public void UpdateOrInsertPerson(int ID, string firstName, string lastName)
        {
            FormData.PEOPLE_LISTRow tempRow = peopleListTable.Rows.Find(ID) as FormData.PEOPLE_LISTRow;!
    
            if (tempRow != null)
            {
                // we found a row, so we are updating it
                tempRow.FIRSTNAME = firstName;
                tempRow.LASTNAME = lastName;
            }
            else
            {
                // nous n'avons pas trouvé de ligne avec l'ID demandé, cela signifie que nous insérons
                peopleListTable.Rows.Add(firstName, lastName);
            }
        }
    
        /// <summary>
        /// Supprime une personne de la table de données PEOPLE_LIST qui sera utilisée par le
        /// ObjectDataSource
        /// </summary>
        /// <param name="ID"></param>
        public void DeletePerson(int ID)
        {
            FormData.PEOPLE_LISTRow tempRow = peopleListTable.Rows.Find(ID) as FormData.PEOPLE_LISTRow;
            peopleListTable.Rows.Remove(tempRow);
        }
    }
    protected void InsertPerson_Click(object sender, EventArgs e)
     {
     // Insérez une nouvelle ligne dans la table de données PEOPLE_LIST,
     // changez le EditIndex afin que nous puissions remplir les informations
     // de la nouvelle personne, puis reliez PEOPLE_LIST.
     formData.PEOPLE_LIST.AddPEOPLE_LISTRow("", "");
     PEOPLE_LIST.EditIndex = formData.PEOPLE_LIST.Rows.Count - 1;
     PEOPLE_LIST.DataBind();
     }
    protected void PEOPLE_LIST_RowUpdated(object sender,
     GridViewUpdatedEventArgs e)
        {
            // Lorsque nous mettons à jour une ligne,
            // nous enregistrons les données
            SaveFormData(formData);
        }
    protected void PEOPLE_LIST_RowDeleted(object sender,
     GridViewDeletedEventArgs e)
        {
            // Lorsque nous supprimons une ligne,
            // nous enregistrons les données
            SaveFormData(formData);
        }
    <?xml version="1.0" encoding="utf-8" ?>
    <MyFormData>
        <MyParameters>
        </MyParameters>
    </MyFormData>
    <?xml version="1.0" encoding="utf-8" ?>
    <MyFormData>
        <MyParameters>
        </MyParameters>
        <MyData>
            <REQUEST_NUMBER />
            <REQUEST_FIRSTNAME />
            <REQUEST_LASTNAME />
            <REQUEST_DATE />
        </MyData>
    </MyFormData>

    Définition de processus

    Aperçu

    Pour intégrer votre formulaire Web dans un processus WorkflowGen, certaines données de processus spécifiques doivent être définies.

    Donnée de processus FORM_DATA

    La donnée de processus FORM_DATA (type FILE) de votre processus sera gérée par EFORMASPX. Elle doit être créée et laissée vide. Par défaut, elle sera créée automatiquement avec un fichier XML encodé en UTF-8 par défaut contenant les lignes suivantes :

    Vous n'avez pas besoin de créer ce fichier, définissez uniquement l'élément de donnée.

    Donnée de processus FORM_URL

    Nous vous recommandons de créer la donnée FORM_URL contenant l'URL de votre formulaire Web. Cette donnée est ensuite utilisée dans toutes les actions EFORMASPX qui font référence au formulaire Web.

    Si votre processus utilise plusieurs formulaires Web, vous pouvez toujours déclarer une donnée FORM_URL_XXXXXXX pour chaque formulaire Web dont vous avez besoin. Assurez-vous d'utiliser des noms significatifs pour remplacer XXXXXXX.

    Donnée de processus FORM_ARCHIVE

    La donnée de processus FORM_ARCHIVE est utilisée pour stocker le formulaire statique pour chaque action terminée. La seule chose à faire est de créer cette donnée de processus avec FILE comme type. Ne téléchargez aucun fichier dessus.

    Pour chaque action que vous souhaitez archiver, créez un paramètre FORM_ARCHIVE et liez-le à cette donnée de processus.

    <?xml version="1.0" encoding="utf-8"?>
    <NewDataSet>
        <Table1/>
    </NewDataSet>

    Développement de formulaires Web : Mode simple

    Aperçu

    Le mode simple est conçu pour faciliter le développement de formulaires Web et offre les avantages suivants :

    • Il ne nécessite aucune ligne de code-behind.

    • Tout peut être fait en mode design.

    • Tous les champs supportés sont automatiquement liés dans deux directions : de WorkflowGen au formulaire Web et du formulaire Web à WorkflowGen.

    • Aucun jeu de données ne doit être créé; seuls les champs souhaités doivent être glissés-déplacés et correctement nommés dans le concepteur de formulaires Web.

    Création de l'application Web

    Outils de développement suggérés

    • Visual Web Developer Express 2013 ou version ultérieure

    • Visual Studio Community ou Professional 2013 ou version ultérieure

    Répertoire d'installation des formulaires Web

    Nous vous suggérons fortement de stocker tous vos formulaires Web dans le répertoire \wfgen\wfapps\webforms (p.ex. : \wfgen\wfapps\webforms\MonFormulaireWeb).

    Notez que si vous modifiez votre processus WorkflowGen et que vous devez modifier le MonFormulaireWeb associé en raison de ces modifications, vous devez au préalable dupliquer MonForulaireWeb, puis créer une autre application IIS. Sinon, les deux versions du processus utiliseront le même MonFormulaireWeb modifié.

    Créez l'application dans IIS

    L'application du formulaire Web doit être déclarée en tant qu'application dans IIS pour être reconnue en tant qu'application de formulaire Web .NET. Suivez ces instructions pour déclarer votre répertoire de formulaires Web en tant qu'application IIS :

    Pour IIS 7 ou version ultérieure

    1. Ouvrez Gestionnaire IIS.

    2. Accédez à l'emplacement de votre formulaire Web, qui doit se trouver dans le nœud Site Web par défaut sous \wfgen\wfapps\webforms\MonFormulaireWeb.

    3. Faites un clic droit sur MonFormulaireWeb et choisissez Convertir en application.

    Création du projet avec Visual Studio

    Créez le projet

    1. Ouvrez Visual Studio et sélectionnez Fichier > Nouveau site Web.

    2. Choisissez Site Web ASP.NET.

    3. Choisissez Système de fichiers dans la liste déroulante Emplacement.

    Obtenir des messages d'erreur détaillés

    Par défaut, vous n'aurez aucun fichier web.config dans votre projet Web si vous utilisez C# comme langage de développement dans l'IDE de Microsoft Visual Studio. Pour afficher des messages d'erreur complets lorsque vous souhaitez déboguer, vous devez disposer d'un fichier web.config. Pour ajouter un fichier web.config par défaut à votre projet, procédez comme suit :

    1. Faites un clic droit sur le nom de votre projet, puis cliquez sur Ajouter un nouvel élément...

    2. Choisissez Fichier de configuration Web, puis cliquez sur OK.

    Afin de pouvoir voir les messages d'erreur complets, modifiez les propriétés suivantes dans le fichier web.config :

    1. Assurez-vous que cette ligne est définie sur "true" :

    2. Assurez-vous que le suivant n'est pas commenté et que la propriété mode est définie sur "Off" :

    Implémentation de base

    Référence

    Vous devez ajouter une référence à WorkflowGen.My.dll dans votre projet Web, puis ajouter cette instruction au début de votre formulaire Web :

    Héritage de classe

    Votre formulaire Web doit hériter de la classe WorkflowPage contenue dans l'espace de noms WorfklowGen.My.Web.UI.WebForms :

    Soumission au workflow à l'aide du SubmitButton

    La soumission du formulaire Web à WorkflowGen se fait en ajoutant simplement n'importe quel type de bouton à votre formulaire Web avec l'ID SubmitButton.

    Vous ne pouvez avoir qu'un seul SubmitButton dans l'ensemble de votre formulaire Web. Si vous voulez plus d'un bouton de soumission (par exemple pour un bouton de soumission de brouillon), vous pouvez utiliser la méthode SubmitToWorkflow() dans l'événement Click de vos boutons supplémentaires.

    Le type de bouton de soumission peut être l'un des contrôles Web suivants : Button, LinkButton ou ImageButton.

    Gestion des champs

    Aperçu

    Les différents champs que glissez-déplacez dans votre formulaire Web doivent avoir leurs IDs exactement les mêmes que les noms des paramètres WorkflowGen dans vos actions afin d'être automatiquement liés avec les valeurs IN ou INOUT.

    Contrôles Web supportés

    • TextBox

    • Label

    • RadioButton

    Type de données de champ

    Le type de données à mettre dans les zones de texte doit être spécifié dans la source de votre formulaire Web. Si vous souhaitez qu'une certaine zone de texte contienne une date, par exemple, vous devez spécifier l'attribut étendu FieldDataType comme Date. Pour ce faire, accédez à la source de votre formulaire Web en cliquant sur Source (à côté de Conception) en bas du formulaire Web.

    Voici un exemple du code qui doit être ajouté à une zone de texte pour contenir une valeur Date :

    Les formats suivants sont supportés :

    • Date

    • DateTime

    • Time

    Les valeurs Date, DateTime, Time, Numeric et Currency seront automatiquement mises en forme en fonction de la culture actuelle de l'utilisateur.

    Il n'est pas nécessaire de spécifier FieldDataType="Text" pour les valeurs de chaîne.

    FieldFormat pour FieldDataType="DateTime"

    Si vous spécifiez le type de données de champ DateTime sur une zone de texte ou une étiquette, vous pouvez également spécifier l'attribut FieldFormat. Cet attribut est utilisé pour indiquer à WorkflowPage comment mettre en forme la date et l'heure de la culture actuelle. Par exemple, si vous souhaitez afficher la date au format December 10, 2019 10:11:29 PM, vous déclarez la zone de texte comme suit :

    Le tableau suivant fournit une liste de toutes les chaînes de format DateTime possibles :

    TimeZoneConversion pour FieldDataType="DateTime"

    Si vous spécifiez le type de données de champ DateTime sur une zone de texte ou une étiquette, vous pouvez également spécifier l'attribut TimeZoneConversion. Cet attribut booléen est utilisé pour indiquer à WorkflowPage de désactiver la conversion du fuseau horaire de l'utilisateur sur le contrôle Web actuel.

    La valeur par défaut est True si cet attribut n'est pas déclaré dans la définition du contrôle Web. Si cet attribut est défini sur False, la valeur DateTime est traitée comme une valeur DateTime GMT/UTC (sans aucune conversion).

    Ceci est disponible depuis WorkflowGen.My version 2.2.3.

    FieldDataBind pour le contrôle asp:Label

    Cet attribut est utilisé pour activer ou désactiver la liaison automatique de données entre un contrôle d'étiquette et son champ de données de formulaire associé.

    La valeur par défaut est True si cet attribut n’est pas déclaré dans la définition du contrôle Label. Si cet attribut est défini sur False, le contrôle Label ne liera pas les données au champ de données de formulaire associé.

    Ceci est disponible depuis WorkflowGen.My version 2.1.8.

    Gestion de la validation des champs

    Voir dans la section .

    Champs en lecture seule

    Voir dans la section .

    Gestion de la colorisation des champs

    Voir dans la section .

    Gestion de l'archive de formulaire

    Voir dans la section .

    Gestion des pièces jointes

    Si vous ajoutez un contrôle FileUpload ou HtmlInputFile à votre formulaire Web, le fichier sera automatiquement enregistré et les données de processus WorkflowGen associées à cet ID de contrôle seront automatiquement mises à jour avec la référence au fichier téléchargé lors de la soumission du formulaire.

    Gestion des ressources

    Voir dans la section .

    Gestion du GridView

    Aperçu

    Cette section explique comment utiliser un GridView (avec certaines limitations) en mode simple.

    Limitations

    • Seuls les BoundFields, CheckBoxFields, CommandFields et TemplateFields sont supportés.

    • Le tri et la pagination ne peuvent pas être utilisés.

    Conception du GridView

    1. Glissez-déplacez un GridView dans le formulaire Web.

    2. Cliquez sur Modifier les colonnes.

    3. Décochez la case Générer automatiquement les champs, car vous choisirez les champs souhaités dans GridView et aucune source de données ne sera utilisée.

    📌 Formats de date/heure et exemples utilisant la culture en-US

    📌 Formats numériques et exemples utilisant la culture en-US

    Nous vous recommandons de changer ApplyFormatInEditMode en "true" si vous utilisez l'un de ces formats dans vos champs. Cette propriété applique la mise en forme souhaitée aux données même lorsque l'utilisateur final modifie les données.

    Si vous utilisez l'un de ces formats, le champ sera automatiquement validé pour une date/heure valide ou un format numérique lors de la mise à jour de la ligne. S'il n'est pas valide, un message d'erreur sera envoyé à l'utilisateur final en utilisant le texte d'en-tête de colonne pour lui indiquer que ce champ particulier n'est pas au format correct et qu'il doit le corriger.

    Le message d'erreur par défaut pour les dates non valides dans les GridViews est You have entered an invalid date in the {0} column, où {0} représente le texte de l'en-tête de la colonne. Vous pouvez spécifier votre propre message en remplaçant la valeur de la propriété InvalidDateGridViewErrorMessage dans la méthode Page_Load de votre formulaire Web.

    La mise en forme utilise la culture actuelle de l'utilisateur.

    Activation de l'insertion, de la modification et de la suppression dans le GridView

    Pour activer l'insertion, la modification et la suppression dans le GridView, procédez comme suit :

    1. Ajoutez un CommandField à votre GridView.

    2. Définissez la propriété CausesValidation sur "False", sinon le bouton Mettre à jour déclenchera la validation de tous les champs de la page.

    3. Définissez la propriété ShowEditButton

    Données de formulaire

    Un nœud DataTable sera automatiquement ajouté par WorkflowPage dans votre jeu de données FORM_DATA. Le nom de cette table sera l'ID de votre GridView et chaque BoundField et CheckBoxField auront son DataColumn automatiquement créé dans cette table avec le DataField comme nom de colonne. Le DataType du DataColumn sera déterminé par le DataFormatString utilisé.

    Définition d'un GridView en lecture seule ou requis

    Le GridView peut être automatiquement défini en lecture seule ou requis à l'aide des paramètres FORM_FIELDS_READONLY et FORM_FIELDS_REQUIRED de vos actions WorkflowGen.

    Lorsqu'un GridView est défini sur requis, il force l'utilisateur final à remplir et à mettre à jour au moins une ligne. Le message par défaut The {0} list needs to have at least one filled row sera affiché à l'utilisateur, où {0} contiendra l'infobulle du GridView ou son ID si aucune infobulle n'a été spécifiée. Vous pouvez modifier ce message en modifier la propriété WorkflowPage RequiredGridViewsErrorMessage dans le Page_Load de votre formulaire Web.

    Lorsqu'un GridView est défini en lecture seule, il masque automatiquement les colonnes CommandField et une ligne vide n'est pas automatiquement insérée dans le GridView.

    Définition de colonnes particulières sur requis dans un GridView

    Vous pouvez utiliser le paramètre FORM_FIELDS_REQUIRED pour définir BoundFields ou TemplateFields sur requis dans votre GridView avec la syntaxe suivante :

    GRIDVIEW_ID.DATAFIELDNAME

    Vous ne pouvez pas utiliser les caractères * (astérisque) ou ^ (caret) pour ces champs particuliers. À la place, vous devez spécifier l'ID GridView et le nom du champ de données pour chaque champ que vous souhaitez définir comme requis.

    Les champs des colonnes requises seront automatiquement colorisés en fonction de la valeur de votre propriété FieldsColorization lorsque vous êtes en mode édition.

    Le message d'erreur par défaut affiché à l'utilisateur final est The {0} column is required. Ce message peut être modifié en modifiant la propriété RequiredColumnsInGridViewsErrorMessage.

    Utilisation des TemplateField dans un GridView

    Vous pouvez utiliser des TemplateField (champs de modèle) dans vos GridViews. Les IDs des contrôles Web que vous utilisez dans vos champs de modèle seront utilisés comme noms de champ dans les données de votre formulaire. Assurez-vous d'avoir les mêmes IDs dans votre ItemTemplate et dans votre EditItemTemplate, sinon les données ne seront pas cohérentes lorsque vous basculerez entre les modes de modification et de listing.

    La prochaine chose que vous devez faire est de définir les valeurs des contrôles Web à l'aide de l'expression Bind conformément à l'exemple ci-dessous.

    Vous pouvez également utiliser l'attribut FieldDataType sur vos contrôles Web insérés dans vos champs de modèle, mais assurez-vous de définir le même FieldDataType dans le ItemTemplate et le EditItemTemplate, sinon les données ne seront pas formatées comme vous le souhaiteriez.

    Vous pouvez également utiliser n'importe quel type de validateur dans vos champs de modèle pour valider l'entrée utilisateur (RangeValidator, RequiredFieldValidator, RegularExpressionValidator, CustomValidator, etc...), la seule contrainte étant que vous devez définir la propriété EnableClientScript sur "False" dans tous les validateurs que vous utilisez dans les champs de modèle.

    Voici un exemple simple d'un TemplateField qui utilise un DropDownList et un RequiredFieldValidator :

    Remplir un GridView avec une source de données externe pour l'initialisation

    Si vous souhaitez remplir un GridView avec une source de données externe, vous devrez écrire du code. Les étapes de base pour ce faire sont les suivantes :

    1. Remplissez votre FormData à l'aide de la méthode FillFormData(FormData).

    2. Récupérez vos données externes dans un DataSet.

    3. Pour chaque ligne du DataTable résultant, créez un clone de la ligne et insérez cette ligne au début de votre DataTable associé à votre GridView (le nom DataTable dans votre FormData est toujours l'ID de votre GridView).

    Voici un exemple simple de remplissage d'un GridView dont l'ID est PeopleList avec quelques prénoms et noms de famille d'un DataSource SQL :

    Création d'un GridView avancé en mode simple

    Si vous souhaitez gérer votre GridView sans utiliser le mode simple, vous pouvez suivre les étapes de la section (mode avancé).

    Pour placer vos données GridView dans le FormData géré par le mode simple, vous devez insérer le DataTable associé à votre GridView dans le jeu de données WorkflowPage FormData dans votre méthode Page_Load.

    Après avoir implémenté l'exemple ci-dessus, vous devrez mettre le code suivant dans votre méthode Page_Load :

    Utilisation des UserControls Web dans les formulaires Web

    Voir dans la section .

    Utilisation de contrôles personnalisés

    Lorsqu'ils travaillent sur des formulaires Web activés pour un workflow, les développeurs sont souvent demandés à implémenter des parties de formulaires Web qui auraient déjà pu être utilisées dans d'autres formulaires Web.

    Parfois, le développeur passe un temps considérable à reproduire et adapter le code existant d'un formulaire Web existant à un autre. Les contrôles personnalisés sont la solution à ces problèmes.

    Un contrôle personnalisé peut être défini comme un contrôle composite composé de contrôles réguliers et incorporant une logique métier.

    Des exemples simples de contrôles personnalisés peuvent être approval zone ou advanced upload control. Visual Studio permet à l'utilisateur d'insérer ce type de contrôle par un simple glisser-déplacer depuis la barre d'outils.

    Installation de contrôles personnalisés dans Visual Studio

    Les contrôles personnalisés doivent être installés dans l'environnement de développement Visual Studio. Le développeur doit uniquement exécuter un assistant d'installation intégré dans un fichier VSI (Visual Studio Installer avec l'extension .vsi).

    Les packs VSI fonctionnent dans toutes les versions de Visual Studio.

    Nous vous recommandons de fermer Visual studio avant de démarrer une installation VSI. Ensuite, double-cliquez sur votre fichier .vsi pour passer à l'assistant d'installation de contrôle personnalisé. Lors de l'installation, il vous sera demandé de faire confiance au composant; répondez OUI.

    Une fois installés, les contrôles personnalisés sont disponibles dans la boîte à outils Visual Studio.

    Utilisation de contrôles personnalisés avec des formulaires Web

    Les développeurs qui ont installé un contrôle personnalisé doivent pouvoir le faire glisser-déplacer sur le formulaire Web en mode Création. Visual Studio ajoute ensuite toutes les références requises à l'assembly du contrôle personnalisé en cours d'insertion dans le projet. Visual Studio copie l'assembly dans le répertoire \bin de votre application à partir du chemin de stockage des paramètres Visual Studio commun.

    Si l'assembly de contrôle est introuvable, le concepteur Visual Studio affiche une erreur de rendu sur votre contrôle.

    Vous pouvez ensuite ajuster divers paramètres de contrôle (tels que les dimensions, le style et d'autres propriétés spécifiques) en modifiant les valeurs de propriété dans la fenêtre Propriétés.

    Sélectionnez le pool d'applications utilisé par votre site et un autre pool d'applications spécifique.

  • Cliquez sur OK.

  • Cliquez sur Parcourir, puis choisissez l'emplacement de votre site Web ASP.NET.
  • Cliquez sur OK.

  • RadioButtonList
  • CheckBox

  • CheckBoxList

  • DropDownList

  • ListBox (mode de sélection simple ou multiple)

  • FileUpload

  • HtmlInputFile

  • GridView

  • Numeric
  • Currency

  • Text (valeur par défaut)

  • 10:11:29 PM

    {0:f}

    Date/heure complète

    December 10, 2020 10:11 PM

    {0:F}

    Date/heure complète (heure longue)

    December 10, 2020 10:11:29 PM

    {0:g}

    Date/heure par défaut

    10/12/2020 10:11 PM

    {0:G}

    Date/heure par défaut (heure longue)

    10/12/2020 10:11:29 PM

    {0:M}

    Modèle mois heure

    December 10

    {0:r}

    Chaîne de date RFC1123

    Thu, 10 Dec 2020 22:11:29 GMT

    {0:s}

    Chaîne de date triable

    2020-12-10T22:11:29

    {0:u}

    Date/heure triable universelle, heure locale

    2020-12-10 22:13:50Z

    {0:U}

    Date/heure triable universelle, GMT

    December 10, 2020 3:13:50 AM

    {0:Y}

    Modèle année mois

    December, 2020

    Ajoutez des
    BoundField
    et
    CheckBoxField
    comme requis. La propriété importante à définir pour chacun de ces champs est
    DataField
    , pour laquelle vous pouvez spécifier tout ce que vous voulez, tant qu'il n'y a pas de caractères spéciaux ou d'espaces dans ce nom.
  • Si vous souhaitez que votre champ soit au format date/heure ou au format numérique, vous pouvez le faire en définissant l'attribut HtmEncode sur "False" et l'attribut DataFormatString sur les valeurs possibles suivantes uniquement :

  • 12:00:00 AM

    {0:f}

    Tuesday, March 03, 2020 12:00 AM

    {0:M}

    March 03

    {0:s}

    2020-03-03T00:00:00

    {0:u}

    2020-03-03 00:00:00Z

    {0:U}

    Tuesday, March 03, 2020 12:00:00 AM

    {0:Y}

    March, 2020

    sur
    "True"
    si vous souhaitez activer l'insertion et la modification.
  • Définissez la propriété "ShowDeleteButton" sur "True" si vous souhaitez activer la suppression dans le GridView.

  • Enregistrez vos données de formulaire à l'aide de la méthode SaveFormData(FormData).
  • Si le GridView n'est pas en mode lecture seule, définissez l'index d'édition de votre GridView sur la dernière ligne.

  • Reliez votre GridView.

  • Chaîne

    Type

    Exemple

    {0:d}

    Date courte

    10/12/2020

    {0:D}

    Date longue

    December 10, 2020

    {0:t}

    Heure courte

    10:11 PM

    {0:T}

    Chaîne

    Exemple

    {0:d}

    3/3/2020

    {0:D}

    Tuesday, March 03, 2020

    {0:g}

    3/3/2020 12:00 AM

    {0:g}

    3/3/2020 12:00:00 AM

    {0:t}

    12:00 AM

    Chaîne

    Exemple

    {0:C}

    $200.00

    {0:N} ou {0:F}

    200.00

    {0:P}

    20.00 %

    {0:R}

    200

    Gestion de la validation des champs
    Mode avancé
    Champs en lecture seule
    Mode avancé
    Gestion de la colorisation des champs
    Mode avancé
    Gestion de l'archive de formulaire
    Mode avancé
    Gestion des ressources
    Mode avancé
    Gestion des GridView
    Utilisation des UserControls Web dans les formulaires Web
    Mode avancé

    Heure longue

    {0:T}

    <compilation debug="true" />
    <customErrors mode="Off" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>
    using WorkflowGen.My.Web.UI.WebForms;
    public partial class Form : WorkflowPage
    <asp:TextBox FieldDataType="Date" ID="TEXT_BOX_DATE" runat="server"> </asp:TextBox>
    <asp:TextBox FieldDataType="DateTime" FieldFormat="{0:U}" ID="TEXT_BOX_DATE_TIME" runat="server"></asp:TextBox>
    <asp:TextBox FieldDataType="DateTime" TimeZoneConversion="False" ID="TEXT_BOX_DATE_TIME" runat="server"></asp:TextBox>
    <asp:Label FieldDataBind="False" ID="MY_LABEL_NOT_BIND" runat="server"></asp:Label>
    <asp:TemplateField HeaderText="Gender">
        <EditItemTemplate>
            <asp:DropDownList ID="Gender" runat="server" SelectedValue='<%# Bind("Gender") %>'>
                <asp:ListItem Selected="True"></asp:ListItem>
                <asp:ListItem>Male</asp:ListItem>
                <asp:ListItem>Female</asp:ListItem>
            </asp:DropDownList>
            <asp:RequiredFieldValidator ID="GenderValidator" runat="server" ControlToValidate="Gender" Display="Dynamic" ErrorMessage="The gender is required" SetFocusOnError="True" EnableClientScript="False">                                    
            </asp:RequiredFieldValidator>
        </EditItemTemplate>
        <ItemTemplate>
            <asp:Label ID="Gender" runat="server" Text='<%# Bind("Gender") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>
    // 1. Remplissez votre `FormData` en utilisant la méthode `FillFormData(FormData)`
                FillFormData(FormData);         
    
    // 2. Récupérez vos données externes dans un DataSetSqlDataSourceSample.SelectCommand = "SELECT FIRST_NAME, LAST_NAME FROM PEOPLE_LIST";
    
          DataSet myData = new DataSet();
          SqlDataAdapter adapter = new
    SqlDataAdapter(SqlDataSourceSample.SelectCommand,
       SqlDataSourceSample.ConnectionString);
          adapter.Fill(myData, "PEOPLE_LIST");
    
    // 3. Pour chaque ligne du DataTable résultant, créez un clone de la ligne
    //    et insérez cette ligne au début de votre DataTable associée au GridView
                foreach (DataRow row in myData.Tables["PEOPLE_LIST"].Rows)
                {
    
                    DataRow rowToAdd = FormData.Tables["PEOPLE_LIST"].NewRow();
                    rowToAdd["FirstName"] = row["FIRST_NAME"];
                    rowToAdd["LastName"] = row["LAST_NAME"];
    
                    FormData.Tables["PeopleList"].Rows.InsertAt(rowToAdd, 0);
                }
    
    // 4. Enregistrez votre FormData en utilisant la méthode “SaveFormData(FormData)”           
    SaveFormData(FormData);
    
    // 5. Si le GridView n'est pas en mode ReadOnly, définissez l'index d'édition de votre GridView sur la dernière ligne
    PeopleList.EditIndex = FormData.Tables["PeopleList"].Rows.Count - 1;
    
    // 6. Relier le GridView
    PeopleList.DataBind();
    // Ajoutez la table de données de la liste des personnes si elle n'est pas déjà
    // dans le FormData du mode simple
    if (!FormData.Tables.Contains(peopleListDataTable.TableName))
    {
    
    // Ajoutez la table peopleList dans le FormData du mode simple
    FormData.Tables.Add(peopleListDataTable);
    
      // Remplissez les données du formulaire
      FillFormData(FormData);
    }