我正在寻找“最佳实践”来在BindingSource中显示外键的值。
示例数据:
PetID---PetName---PetTypeID
1---Tom---1
2---Jerry---2
PetTypeID---PetType
1---Cat
2---Mouse
我有宠物类和宠物形式。以下代码位于Pet表单上,用于将数据作为Pet集合从数据库返回并绑定数据:
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"));
使用当前示例,txtPetType将显示PetTypeID(1或2),但我希望它显示实际值(Cat或Mouse)。
那么,处理这样的事情的最佳实践是什么?向Pet类添加新属性?加入存储过程中的两个表来返回值?其他选择?
注意:PetName是可编辑的,而PetTypeID在这个实例中是只读的,所以我想排除一个组合框。
解释,示例,阅读资源都会非常感激!
答案 0 :(得分:0)
外观属性是最简单的选项 - 特别是如果它是只读的;只需添加一个属性(如果生成了类型,则在partial
类中),用于处理关系。不过还有其他路线。你可以写一个TypeConverter
并用它装饰房产;但这对于生成的类型来说是一种痛苦(因为您无法将属性添加到在单独的分部类文件中声明的成员)。您也可以使用自定义属性模型(ICustomTypeDescriptor
/ TypeDescriptionProvider
),但这些大量过度仅。
我可以根据需要扩展其中任何一个......但大多数(除了第一个)都有很多工作......
答案 1 :(得分:0)
是的,就像Marc说的那样,将PetTypeName属性添加到Pet类中,该类查询数据库(或者其他任何,我假设数据库)并从PetTypeID获取PetType记录:
public class Pet {
...
public string PetTypeName {
get {
PetType pt = getPetTypeById(PetTypeID); // this method is up to you to write, of course
return pt.Description;
}
}
...
}
然后,不是绑定到PetTypeID,而是绑定到这个新的PetTypeName属性。