图示效果如下:
1、DataSet作为内存关联数据库 DataSet ds = new DataSet("DataSet");
1.1将一级列表、二级列表(2个)、三级列表的所有DataTable加载到DataSet里
ds.Tables.AddRange(new DataTable[] { datatable1.Copy(),datatable2.Copy(),datatable3.Copy(),datatable2-1.Copy()});
1.2 建立关联约束
一级列表和二级2表列表建立关联,关联字段DataColumn
ds.Relations.Add("lv1-2关联名称",ds.Tables[0].Columns["单据编号"], ds.Tables[1].Columns["单据编号"],false);
一级列表和二级3表列表建立关联 ,关联字段DataColumn
ds.Relations.Add("lv1-3"关联名称, ds.Tables[0].Columns["单据编号"], ds.Tables[2].Columns["单据编号"], false);
二级2表列表和三级列表建立关联 ,关联字段DataColumn
ds.Relations.Add("lv2-2-1关联名称", ds.Tables[1].Columns["单据编号"], ds.Tables[3].Columns["单据编号"], false);
2、GridControl 添加 一级:gridview1(主列表MainView)
二级:gridview2 \ gridview3
三级:gridview2-1
gcList.ViewCollection.Add(gridview1);
gcList.ViewCollection.Add(gridview2);
gcList.ViewCollection.Add(gridview3);
gcList.ViewCollection.Add(gridview2-1);
2.1 gridview(一级主列表MainView) 进行设置
//清单按钮一直显示
gridview.OptionsDetail.SmartDetailExpandButtonMode = DevExpress.XtraGrid.Views.Grid.DetailExpandButtonMode.AlwaysEnabled;
//无数据也可以点击展开按钮
gridview.OptionsDetail.AllowExpandEmptyDetails = true;
2.2 gridview2(二级列表) 进行设置
//清单按钮一直显示
gridview.OptionsDetail.SmartDetailExpandButtonMode = DevExpress.XtraGrid.Views.Grid.DetailExpandButtonMode.AlwaysEnabled;
//无数据也可以点击展开按钮
gridview.OptionsDetail.AllowExpandEmptyDetails = true;
2.3 添加gridcontrol的所有关联名称以及层级,必须和DataSet关联名称保存一致
gcList.LevelTree.Nodes.Add("lv1", detailPatternView);
gcList.LevelTree.Nodes.Add("lv2", detailPatternView2);
这里是Nodes["lv1"]的层级下的关联
gcList.LevelTree.Nodes["lv1"].Nodes.Add("lv3", detailPatternView_Detail);
2.4 设置每个gridview的子级关联名称
gridview1.ChildGridLevelName = "lv1";
gridview1.ChildGridLevelName = "lv2";
gridview2.ChildGridLevelName = "lv3";
3、DataSet里的一级列表数据源绑定到gridcontrol
gcList.DataSource = ds.Tables[0];
4、GridView1的主列表展开时动态加载子级数据列表,用到MasterRowGetChildlist事件
private void GridView1_MasterRowGetChildList(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowGetChildListEventArgs e)
{
if (ds.Tables.Count > 1 && GridView1.GetRowCellValue(e.RowHandle, "单据编号") !=null)
{
/ /子级列表不存在数据就导入数据
if( ds.Tables[1].Select("单据编号='"+ GridView1.GetRowCellValue(e.RowHandle, "单据编号").ToString() + "'").Count()==0)
{
ds.Tables[1].Rows.Add(new object[] { gvList.GetRowCellValue(e.RowHandle, "单据编号").ToString(), e.RowHandle.ToString() }); ;
//一定记得提交数据更新动作,否则数据不显示
ds.Tables[1].AcceptChanges();
}
}
到此结束,谢谢!