在使用报表的时候,有很多需要主从表一起显示,从表不需要另外弹窗显示明细,反而直接显示在主表下方。如图所示:

第一次做这个功能,主从表显示,从表列隐藏,从表单元格点击事件这三个功能点花费了很多时间,在网上参考了很多热心分享,热爱记录的小伙伴的资料,总算大功告成,真的非常感恩!

首先贴第一个功能,主从表显示。这个显示从表是看不到的,主要是代码里面用DataRelation来实现。当时写后台SQL的时候,为了把主表与子表关联起来也是花费了不少脑筋。因为这些数据是关联而成,并没有主外键之间的关联。但因为有主从表的关系,关联还是有的。就是用ROW_NUMBER()函数添加序号列,用相关联的字段更新这个序号列,主从表就能通过序号列关联到一起。

主从表显示的关键代码如下:

//主表

//调用存储过程获取数据源,sp是存储过程参数

DataSet mainDS = Common.SqlHelper.ExecuteDataset(Common.SqlHelper.connString, CommandType.StoredProcedure, "BalanceInformation", sp);

DataTable mainDT = mainDS.Tables[0];//第一个表格,显示主表信息

mainDT.TableName = "Main";

DataSet detailDS = new DataSet();

if(mainDT.Rows.Count > 0)

{

//子表

DataTable detailDT = mainDS.Tables[1];//第二个表格,显示子表信息

detailDT.TableName = "Detail";

mainDS.Tables.Remove(detailDT);

mainDS.Tables.Add(detailDT);

}

//设定关系,ds.a(表).MainId(字段)=ds.b(表).MainId

DataRelation dr = new DataRelation("明细", mainDS.Tables["Main"].Columns["MainId"], mainDS.Tables["Detail"].Columns["MainId"]);

mainDS.Relations.Add(dr);

//绑定数据源
dt = mainDS.Tables["Main"];
gridControl1.DataSource = dt; 该功能的参考链接是:
https://blog.csdn.net/david_520042/article/details/78549978
https://blog.csdn.net/qq_33459369/article/details/80006845
从表列隐藏

//隐藏子表(即从表)的列,获取主表的行展开事件

private void gridView3_MasterRowExpanded(object sender, DevExpress.XtraGrid.Views.Grid.CustomMasterRowEventArgs e)

{

    //获取所点击行的从表对象    
DevExpress.XtraGrid.Views.Grid.GridView childView= gridView3.GetDetailView(e.RowHandle, e.RelationIndex) as DevExpress.XtraGrid.Views.Grid.GridView;
if (childView != null)
{
childView.Columns["MainId"].Visible = false;  //隐藏子表列 }
} 该功能的参考链接是:
https://www.cnblogs.com/super-cj/archive/2012/06/27/2565874.html
从表单元格点击事件

从表点击的时候,是在主表的MasterRowExpanded事件里操作,由于从表是看不到的,所以在属性窗口里面是找不到的。只能通过代码来实现。

代码如下:

//隐藏子表(即从表)的列,获取主表的行展开事件

private void gridView3_MasterRowExpanded(object sender, DevExpress.XtraGrid.Views.Grid.CustomMasterRowEventArgs e)

{

   //由于从表的委托事件里面需要再次获取从表对象,所以e.RowHandle,e.RelationIndex需要有全局变量存储传递。
rowHandle = e.RowHandle;
relationIndex = e.RelationIndex; //获取所点击行的从表对象    
DevExpress.XtraGrid.Views.Grid.GridView childView= gridView3.GetDetailView(e.RowHandle, e.RelationIndex) as DevExpress.XtraGrid.Views.Grid.GridView;
if (childView != null)
{
childView.Columns["MainId"].Visible = false;  //隐藏子表列
//设置从表单元格点击的事件,当从表展开时,点击单元格时发生
childView.RowCellClick += new DevExpress.XtraGrid.Views.Grid.RowCellClickEventHandler(this.ChildView_Click); }
} //委托事件
private void ChildView_Click(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e)
{
//获取主表,根据全局变量获取到从表当前所属的主表
DevExpress.XtraGrid.Views.Grid.GridView childView = gridView3.GetDetailView(rowHandle, relationIndex) as DevExpress.XtraGrid.Views.Grid.GridView;
if (childView != null)
{
//获取从表的行
DataRow dr = childView.GetDataRow(e.RowHandle);
//获取该行[发生日期]列的值
string startHappenDate = dr["发生日期"].ToString();
//获取当前点击的单元格的值
string count = e.CellValue.ToString();
// 获取该列的字段名e.Column.FieldName } }

完毕!逐一击破后发现也不是很难,折磨了我几天的需求总算落下帷幕了。

DevExpress gridcontrol gridView主从表折叠/展开显示的更多相关文章

  1. DevExpress.GridControl.gridView的一些注意

    1.DevExpress控件组中的GridControl控件不能使横向滚动条有效.现象:控件中的好多列都挤在一起,列宽都变的很小,根本无法正常浏览控件单元格中的内容. 解决: gridView1.Op ...

  2. DevExpress GridControl GridView 导出到 Excel 类

    说明: 1>GridView 导出到 Excel (如果分页,只导出当前页数据) 2>GridView 导出到 Excel 3>方法2可以参考DataTable 导出到 Excel ...

  3. devExpress GridControl gridView笔记

    gridView1.Appearance.EvenRow.BackColor = Color.FromArgb(, , , ); gridView1.Appearance.OddRow.BackCol ...

  4. gridView 主从表实现

    1.主要代码: private void Form2_Load(object sender, EventArgs e) { DataTable dt1 = new DataTable("dt ...

  5. DEV—【GridControl主从表】

    先附上效果图,不是想要这个效果的朋友就不用可以继续寻找了. DEV—GridControl制作主从表: (注:此例没有用到数据库,只是单纯的在内存中操作数据.) 写这一笔,是为了能更好的理解主从表,的 ...

  6. Devexpress GridControl z

    http://minmin86121.blog.163.com/blog/static/4968115720144194923578/ 1 AllowNullInput=False; --Devexp ...

  7. ASPxGridView中如何对主从表绑定数据

    注:在从表的aspxgridview中的(OnDataBinding()事件中绑定数据)-----代码如下 //绑定属性值表protected void grid2_sonTable_DataBind ...

  8. 在ASPxGridView的主从表显示中,有什么属性可以只让其每次选择只展开一列?

    在ASPxGridView的主从表显示中,有什么属性可以只让其每次选择只展开一列?(效果图如下:): 在ASPxGridView的主从表显示中,有什么属性可以只让其每次选择只展开一列(效果图) 实现该 ...

  9. 在GridControl表格控件中实现多层级主从表数据的展示

    在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...

随机推荐

  1. 简单的端口扫描器(TCP connect)

    端口扫描器原理相对简单,采用的是TCP connect状态判断.具体来说:TCP connect方式使用系统网络API connect向目标主机的端口发起连接,如果无法连接,说明该端口关闭.该方式扫描 ...

  2. 理解交叉熵(cross_entropy)作为损失函数在神经网络中的作用

    交叉熵的作用 通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个节点: 而即便是R ...

  3. JavaWeb学习(一)———JavaWeb入门

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  4. [SCOI2010] 连续攻击游戏

    题目 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一 ...

  5. 自定义Fiddler插件一

    上个月自定义了一个Fiddler的插件,可以根据请求生成接口自动化测试的RF和Python代码,这样测试人员只需要手动操作页面用Fiddler抓取报文,就可以直接生成RF.Python代码,然后只需要 ...

  6. Linux中重命名乱码文件

    Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb o]# l ...

  7. c# DataSet转换为Json

    /// <summary> /// DataSet转换为Json /// </summary> /// <param name="dataSet"&g ...

  8. [PHP] 数据结构-二叉树的创建PHP实现

    1.利用递归的原理,只不过在原来打印结点的地方,改成了生成结点,给结点赋值的操作if(ch=='#'){*T=NULL;}else{malloc();(*T)->data=ch;createFu ...

  9. Rancher2.0构建kubernetes(K8S)集群

    一.环境准备 1.准备至少3台CentOS7版本的虚拟机 # IP地址 主机名称 192.168.1.160 rancher 192.168.1.161 master 192.168.1.162 no ...

  10. Perfect hashing (And Minimal perfect hashing)

    Perfect Hashing: A hash function that is injective-that is, maps each valid input to a different has ...