GridControl 控件-----List<T>数据源 实现主从表关系绑定

来源:互联网 发布:oa审批流程数据库设计 编辑:程序博客网 时间:2024/06/06 06:50

网上有很多有关GridControl 控件的使用和属性调整,本系列博文中不在说明.

下面先说GridControl 如何用List<T>作为数据源实现主从关系视图,博主在刚开始做的时候也是按网上的教程进行学习做普通的视图绑定,没有任何问题,都是因为广大网友,贴子写的好,首先得谢谢他们.

学会后,发现GridControl控件,还可以实现主从关系视图,体现出层级,于是大胆的乱整一通,结果力出了,精也费了绑定不成功,开始在度娘和Google上通过中文关键搜索如何实现等等,结是铺天盖地贴子和转载,但是他们都用一个东西,就是DataSet来实现,加入多张表,建关系,看一看挺明白的,方法也比较简单.问题大次出现,项目中用的数据实体都是基于List<T>来实现.

第一个实现的方法就是List<T> 转换到DataSet 或者DataTable,想了想结果还是果断PASS掉,为什么?只要一个界面上用到GridControl 和主从关系视图,那么都需要转换一次,系统开销吃不消,在说很麻烦,在加上偶很懒.所以说还是找对应的方法;

搜啊搜结果还是木求得答案.在Google上搜索的国外网站,打不开,因为公司的很慢,(个人发现每个公司的网络都很慢,不晓得啥原因,就算是新搬迁的公司,用上一两月就慢了).回家开始访问国外网站,发现一个老外也在问这个问题,下面有人回贴,就那样找到了答案;

第一步:准备数据源

public class Parent
 {

        public string PropOfParent
        {  get ; set ; }

        public IList<Child> Childs
        {get ;  set ; }
}

public class Child
{
        public string PropOfChild
        {get ;  set ;  }
}

 

第二步: 自定义结构类

public class MyBindingSource : BindingSource {
        public MyBindingSource(IContainer container) : base(container) { }

        public override PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors) {
            PropertyDescriptorCollection pdc = base.GetItemProperties(listAccessors);
            List<PropertyDescriptor> list = new List<PropertyDescriptor>();
            foreach (PropertyDescriptor descr in pdc)
                if (descr.Name != "Childs")
                    list.Add(descr);
            PropertyDescriptor pd = TypeDescriptor.CreateProperty(typeof(Parent), "Childs", typeof(List<Child>), new Attribute[] { new BrowsableAttribute(true) });
            list.Add(pd);
            pdc = new PropertyDescriptorCollection(list.ToArray(), true);
            return pdc.Sort();
        }
    }

第三步:

1.在Form中加入一个GridControl 控件,

2.并加入MyBindingSource 为parentBindingSource

3.设置parentBindingSource的DataSource 的数据源为Parent

4.设置GridControl的DataSource 为parentBindingSource

5.在GridControl 中添加一主视图gridView1

6. 在主视图下添加一层视图为gridView2,并修改当前视图的 Change LeveName 为Childs(如果不修改结果是数据绑定失败)

7.在各视图中添加列,并在列中绑定相应视图的字段(注意:在绑定第二层或第三层....N层时,她会根据你的层次关系设置路径这时,你需要把前边的路径都删掉,只需要字段名则数据实体类中的属性名)

以上是绑后的结果

第四步: 加入实例数据

Parent p = new Parent();
p.PropOfParent="AA";
p.Childs.Add(new Child() {  PropOfChild="AA1"});
Parent p1 = new Parent();
p1.PropOfParent = "BB";
p1.Childs.Add(new Child() { PropOfChild = "BB1" });

parentBindingSource.Add(p);
parentBindingSource.Add(p1);

结果出现:

 

 

 

第五步:在完成第四步后实际绑定和目标已经实现;但是出一个小小的问题就从表名称是英文的,并且把数据实体属性名给暴怒,比如本文中的Childs一样,但是我们开发时需防一下君子;优化UI,毕竟客户都是不是人人懂英文,所以需要设置从表视图显示名称,设置gridView2属性中的ViewCaption 属性,设置你能描述你本视图数据的名称

运行结果

 

 

Dome 下载地(VS2010+Developer Express v2011 vol 2)http://download.csdn.net/download/z4808415/4539659    有关版权问题自行搞定

,实例中并未更改从表显示名称