在bindingsource中显示基于外键的查找值

时间:2009-10-14 18:59:27

标签: c# winforms data-binding class foreign-keys

我正在寻找“最佳实践”来在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在这个实例中是只读的,所以我想排除一个组合框。

解释,示例,阅读资源都会非常感激!

2 个答案:

答案 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属性。