Tutorial 13 – Binder une ComboBox

Published 30 August 10 03:26 AM | Nico

La vidéo du Tutorial

 

Le DatabaseEnum

Nous allons binder des informations supplémentaires sur l’entité Produit, la taille et l’unité associée.

Dans notre entité Product, nous avons bien la colonne Size:

image

Si nous regardons la table physique dans SQL Server, nous constatons qu’il y a une colonne SizeUnitMeasureCode pour représenter l’unité de mesure de la taille:

image

Cette colonne est une ForeignKey, et n’est pas présente dans mon Schéma. Ceci est normale car les ForeignKey du Schéma sont représentées avec des Relations.

Dans la base physique, la ForeignKey pointe vers une autre Table UnitMeasure, qui est la table de référence des Unités.

image

Nous allons enrichir notre Schéma pour tenir compte de cette table de référence. Nous pourrions ajouter une Entité UnitMeasure, et créer une Relation avec l’Entité Product.

Mais nous avons à notre disposition dans le Schéma, quelques chose de plus adapté pour gérer les tables de références, qui est le DatabaseEnum. Comme son nom l’indique, le DatabaseEnum est un Enum, dont les valeurs sont stockées dans la base.

Nous allons créer ce DatabaseEnum manuellement.

Dans Visual Studio, ouvrez le Schéma AdventureWorks.Entities.

A partir de la Toolbox, dropez un DatabaseEnum.

Nommez le UnitMeasure.
image
Renseignez son PhisicalName et son Schéma.

Mettez la propriété Identifier à False, la clé de cette Table est définie dans la colonne UnitMeasureCode (la propriété Identifier permet de définir automatiquement une colonne Id).
image
Ajoutez la colonne UnitMeasureCode avec les attributs suivants:
- Identifier: True. C’est bien cette colonne qui définit la clé.
- Name: UnitMeasureCode
- Type: String
- PhysicalName: UnitMeasureCode. C’est le nom de la colonne physique tel qu’il est défini dans la base. Si le PhysicalName n’est pas renseigné, le nom logique sera pris par défaut, mais il est plus sur de renseigner cet attribut, si nous souhaitons modifier le nom logique par la suite.
- Size: 3
image
Ajoutez la colonne Name avec les attributs suivants:
- Name: Name.
- Type: String.
- PhysicalName: Name.
- Size: 50.
image
Dans l’entité Product, ajoutez une nouvelle colonne: - Name: SizeUnitMeasureCode
- Nullable: True. Cette colonne peut être null, certains produits n’ont pas de size et donc pas d’unité.
- Type: UnitMeasureCode. Ce nouveau type est maintenant disponible, avec le DatabaseEnum.
- PhysicalName: SizeUnitMeasureCode.

Sauvegardez le Schéma. 
image

Avec notre DatabaseEnum, nous avons un nouveau type disponible. Ce n’était pas le cas avec les Entités; nous ne pouvons pas définir une colonne de type Product ou ProductCategory. Dans le cas de l’Entité, c’est la Relation qui nous permet de définir un lien entre 2 Entités. Dans le cas du DatabaseEnum, il n’y a pas de Relation, c’est le type de la colonne qui définit le lien. Ces 2 logiques sont différentes, même si elles sont représentées par un schéma physique similaire (une ForeignKey entre 2 tables).

Dans quel cas utiliser un DatabaseEnum ?

Le DatabaseEnum est utile quand il s’agit d’une liste de références, dont la liste est peu nombreuse et évolue peu dans le temps. Une liste de Pays, ou Département est un bon exemple de DatabaseEnum. A la différence d’une liste d’Entités, une liste de références est chargée en une fois dans l’application.

Le Contrôle ComboBox

Nous allons maintenant modifier notre Contrôle pour afficher et éditer la taille et l’unité de notre Product.

Dans Visual Studio, ouvrez le fichier MainControls.htm.

Dans le contrôle ADWProduct, ajoutez une ligne dans la table, avec un nouveau contrôle input TxtSize.
<tr>
      <td align="right" style="width:200px">Taille:</td>
      <td style="width:200px" ><input name="TxtSize" type="text" /></td>
</tr>
Ajoutez un controle ComboBox à côté de l'Input TxtSize.

Un controle ComboBox est un Select html, avec un nom. Les valeurs de ce Select sont gérées par le Binding.

Nommez le contrôle CboUnitSize.

Sauvez le fichier et compilez la Solution.
<select name="CboUnitSize"></select>
<tr>
      <td align="right" style="width:200px">Taille:</td>
      <td style="width:200px" ><input name="TxtSize" type="text" /><select name="CboUnitSize"></select></td>
</tr>

ListBinding

Nous allons maintenant Binder ces 2 nouveaux contrôles.

Dans BindingStudio, ouvrez la vue ADWProduct.

Ajoutez 2 Binding sur les 2 contrôles:
- TxtSize
- CboUnitSize

Le Binding de TxtSize est similaire à celui de TxtName; il a une propriété value bindée sur la colonne Size de l’Entité Product.

image
Le Binding de CboUnitSize est de type ListBinding et présente quelques caractéristiques particulières:

DataName: pointe vers la Table qui contient la liste des valeurs à afficher. Dans notre cas, il s’agit du DatabaseEnum UnitMeasure, qui est maintenant présente dans notre DataSet.

DisplayMember: désigne la colonne de la Table qui doit servir à l’affichage. Il s’agit ici de la colonne Name de la Table Unitmeasure.

ValueMember: désigne la colonne de la Table qui contient les valeurs de la liste. Il s’agit de la colonne UnitMeasureCode de la Table UnitMeasure.

SelectedValue: désigne la colonne qui est mise à jour lorsque la Combo sélectionne une valeur. Dans notre exemple, il s’agit de la colonne SizeUnitMeasureCode de notre Product.

Sauvegardez la configuration.
image

Si nous lançons notre application, nous constatons que nos nouveaux contrôles sont bien présents, mais que la liste est vide. En effet, nous n’avons nulle part précisé quand la Table UnitMeasure devait être remplie.

Chargement d’un DataBaseEnum

Nous allons ajouter ce code dans notre Commande de chargement  initial de données.

Dans Visual Studio, ouvrez le fichier ADWService.

Dans la Commande LoadInitialData, ajoutons le chargement du DatabaseEnum UnitMeasure.

Nous avons également une API pour charger tous les DataBaseEnum d’un Domain. Etant que nous avons un seul DatabaseEnum, ce code spécifique suffit pour le moment.

Compilez le Projet et relancez l’Application. 
DataSet IADWService.LoadInitialData()
{
    IDataManager dm = EntityManager.FromDataBaseService("DataAccessAdventureWorks");
    dm.LoadEntities<ProductCategory>();
    dm.LoadDatabaseEnum<UnitMeasure>();
    return dm.Data;
}

Nous constatons que la liste est correctement remplie et que la valeur sélectionnée correspond bien à l’Unité du produit courant.

image

Néanmoins, si nous sélectionnons un Product qui a une SizeUnit qui a la valeur null, nous avons l’exception suivante:

image

Ceci est normal, car aucune valeur des Unités n’a la valeur nulle. La ComboBox ne peut trouver une valeur null dans sa liste.

Nous allons donc ajouter une propriété à la ComboBox pour gérer la valeur nulle. Ceci est pris en charge avec la propriété custom NullValueDisplay. Une propriété custom se définit avec l’attribut aas:properties et un couple clé/valeur.

Dans Visual Studio, éditez le fichier MainControls.htm

Dans la définition du contrôle ComboBox, ajoutez la propriété custom NullDisplayValue avec la chaine de caractères que vous souhaitez afficher lorsque la valeur est null.

Compilez le projet.
<select name="CboUnitSize" aas:properties="NullValueDisplay:'Choose Unit ...'"></select>

Si nous relançons l’application, nous constatons que la ComboBox gère bien la valeur nulle et que la valeur affichée est bien la valeur définie dans le contrôle.

image

Voilà, nous avons vu comment binder une ComboBox sur une liste de valeur et définir la valeur d’une colonne d’une Entité à l’aide de cette ComboBox. Les ComboBox fonctionnent également avec des Relations, et il est possible de définir dynamiquement des associations par Binding, entre plusieurs Entités.

La suite au prochain épisode.

Classé sous : , , ,

Commentaires

Pour ajouter un commentaire, vous devez d'abord vous identifier ici
Pas de commentaires