DevExpress gridcontrol gridView主从表折叠/展开显示

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

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

首先贴第一个功能,主从表显示。这个显示从表是看不到的,主要是代码里面用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

    }
    
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DevExpress是一款常用的软件开发工具,可以支持开发3层主从的应用程序。 3层主从是指应用程序的数据结构分为三层:现层、业务逻辑层和数据访问层。其中,现层负责用户界面的展示和用户交互;业务逻辑层负责处理各种业务逻辑;数据访问层负责与数据库进行数据交互。 使用DevExpress来实现3层主从的应用程序,可以从以下几个方面入手: 1. 现层:DevExpress提供了丰富的用户界面控件,可以方便地创建各种格、输入框、按钮等界面元素,使用户可以方便地查看和操作数据。 2. 业务逻辑层:在业务逻辑层中,可以使用DevExpress提供的组件来处理各种业务逻辑。例如,可以使用GridView控件来展示主数据,并可以通过事件处理程序来处理用户的操作,如新增、修改、删除等操作。同时,可以使用Master-Detail模式来展示主从关联的数据。 3. 数据访问层:DevExpress提供了各种数据库访问组件,可以方便地与数据库进行数据交互。通过使用这些组件,可以实现对数据库的增删改查等操作,使数据能够与前端界面进行同步。 总结来说,DevExpress是一款功能强大的软件开发工具,可以很好地支持3层主从的应用程序开发。通过合理地使用DevExpress提供的各种组件,可以方便地创建现层、业务逻辑层和数据访问层,并实现数据的展示、处理和保存等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值