2009-10-14 7 views
2

Je suis à la recherche de "meilleures pratiques" pour afficher la valeur de la clé étrangère dans un BindingSource.Affichage de la valeur de recherche basée sur la clé étrangère dans la source de liaison

données Exemple:

PetID---PetName---PetTypeID 
1---Tom---1 
2---Jerry---2 


PetTypeID---PetType 
1---Cat 
2---Mouse 

J'ai une classe Pet et forme Pet. Le code suivant est sur le formulaire Pet pour renvoyer des données de la base de données comme une collection Pet et de lier les données:

private BindingSource PetBindingSource = new BindingSource(); 
PetBindingSource.DataSource = Pet.GetPets(); 

txtPetName.DataBindings.Add(new Binding("Text", PetBindingSource, "PetName")); 
txtPetType.DataBindings.Add(new Binding("Text", PetBindingSource, "PetTypeID")); 

Avec cet exemple actuel, txtPetType affiche le PetTypeID (1 ou 2), mais je le veux pour afficher la valeur réelle (Chat ou Souris). Alors, quelles sont les meilleures pratiques pour gérer quelque chose comme ça? Ajouter une nouvelle propriété à la classe Pet? Joignez les deux tables dans la procédure stockée pour renvoyer la valeur? Autres options?

Remarque: PetName est modifiable, alors que PetTypeID sera en lecture seule dans cette instance, donc je voudrais exclure une zone de liste déroulante.

Explications, exemples, ressources de lecture seraient tous très appréciés!

Répondre

0

Une propriété de façade est l'option la plus facile - en particulier si elle est en lecture seule; Ajoutez simplement une propriété (dans une classe partial si le type est généré) qui parcourt la relation. Il y a d'autres routes, cependant. Vous pouvez écrire un TypeConverter et décorer la propriété avec; c'est une douleur pour les types générés, bien que (puisque vous ne pouvez pas ajouter un attribut à un membre déclaré dans un fichier de classe partiel séparé). Vous pouvez également utiliser des modèles de propriété personnalisés (ICustomTypeDescriptor/TypeDescriptionProvider), mais ceux-ci seraient massivement surpasser juste pour cela.

Je peux étendre sur ces nécessaire ... mais la plupart (sauf le premier) sont beaucoup de travail ...

+0

Bonjour Marc, pouvez-vous développer le premier article, s'il vous plaît? Peut-être, un exemple? C'est nouveau pour moi, alors chaque petit geste est utile. – Sesame

+0

Eh bien, quel est votre modèle d'objet? En bref, vous pouvez simplement ajouter 'chaîne publique PetTypeName {get {return/* navigate * /. Description; }} 'ou similaire - le'/* navigue */'dépend entièrement de votre modèle d'objet ... –

0

Eh oui, comme dit Marc, ajoutez une propriété PetTypeName à la classe Pet, qui interroge la base de données (ou peu importe, je suis base de données en supposant) et obtient l'enregistrement PetType du PetTypeID:

public class Pet { 
    ... 
    public string PetTypeName { 
    get { 
     PetType pt = getPetTypeById(PetTypeID); // this method is up to you to write, of course 
     return pt.Description; 
    } 
    } 
    ... 
} 

Alors, au lieu de se lier à PetTypeID, se lient à cette nouvelle propriété PetTypeName.

Questions connexes