今天一位同事咨询Devexpress TreeList控件绑定自动显示父子节点对像,但结果是不会显示带父子节点关系,而是将所有的节点作为父节点显示出来了,对像类的代码如下
public class Item:XPBaseObject { public Item() : base() { } public Item(Session session) : base(session) { } [Key(true)] public int Id{ get;set; } public string Name{get;set;} [Association("SubItems"),Persistent("ParentId")] public Item ParentItem; [Association("SubItems", typeof(Item)), Aggregated] public XPCollection<Item> SubItems { get { return GetCollection<Item>("SubItems"); } } }
1 //...省略部分 2 3 this.treeList1.KeyFieldName = "Id"; 4 this.treeList1.Name = "treeList1"; 5 this.treeList1.ParentFieldName = "ParentId"; 6 7 //...省略部分
实际XPO在数据库中自动生成的数据结构也是符合我们设计的要求的,填写的数据什么地都是正确的,但结果就是不会按照父子节点关系来显示。最后在之前的代码中找到不一样的地方,就是this.treeList1.ParentFieldName = "ParentId"; 这里的字段名在对像类中没有显示声明一个属性导致,虽然在属性ParentItem里有指定字段名ParentId但这里仅仅用于将外键关系存入ParentId这个字段而已。TreeList控件并不会智能地读取该值作为父节点的主键值,还是得要在对像类中声明一个只读的ParentId属性才能解决这个问题,见下面的代码:
1 public class Item:XPBaseObject 2 { 3 4 //...省略 5 6 7 [NonPersistent] 8 public int ParentId 9 { 10 get { return ParentItem == null ? 0 : this.ParentItem.Id; } 11 } 12 13 14 //...省略 15 16 17 }
总结:TreeList 控件中绑定的字段都是需要在对像类中要存在的属性才可以绑定,不能光在数据库中存在字段就可以,如果属性不存在可以写一个只读并且不用存入数据库的属生用于绑定专用。
你今天为你的梦想努力了吗?