原文地址:http://hi.baidu.com/qdseashore/item/38f1153e9d0143637d034b7a

在做项目中,往往需要在查询基类模板窗口内做主细关系Grid,引用一下代码可减少工作量,只需给此过程传递主、细SQL语句以及关联的关键字段即可完成如图所示的效果:

#region 执行主细查询过程
        public void ExeQuery(string sMSql,string sDSql,string RelaitionField)
        {
            int iMCountItemNum = 0; int iDCountItemNum = 0;
            int iMSumItemNum = 0; int iDSumItemNum = 0;
            //查询。
            if (sMSql == null || sMSql == "" || sDSql == null || sDSql == "")
            {
                return;
            }

#region 根据SQL填充主、细表
            using (OracleConnection connection = new OracleConnection(DbHelperOra.connectionString))
            {
                
                _dtQuery = new DataSet();
                try
                {
                    connection.Open();
                    OracleDataAdapter command = new OracleDataAdapter(sMSql, connection);
                    command.Fill(_dtQuery, "MA");
                    command.SelectCommand.CommandText=sDSql;
                    command.Fill(_dtQuery,"DE");
                    command.Dispose();
                }
                catch (System.Data.OracleClient.OracleException ex)
                {

}
                finally
                {
              
                    connection.Close();
                }
            }
            #endregion

#region 主表动态构造字段。
            try
            {
                //获取到表结构。
                if (_dtQuery.Tables["MA"].Rows.Count >= 0)
                {
                    gvMainList.Columns.Clear();
                    gvMainList.GroupSummary.Clear();
                    gvMainList.ClearGrouping();
                    //gvMainList.OptionsBehavior.Editable = true;
                    int iVisible = 0;
                    //根据表结构动态加载到GridControl控件中。
                    foreach (DataColumn _dcQuery in _dtQuery.Tables["MA"].Columns)
                    {
                        iVisible++;
                        //动态添加
                        DevExpress.XtraGrid.Columns.GridColumn gcQueryList = new DevExpress.XtraGrid.Columns.GridColumn();
                        gcQueryList.Name = "_dc" + _dcQuery.ColumnName.ToUpper();
                        gcQueryList.Caption = _dcQuery.ColumnName;
                        gcQueryList.FieldName = _dcQuery.ColumnName;

//数字类型
                        if ((_dcQuery.DataType.ToString().ToUpper() == "SYSTEM.DECIMAL" || _dcQuery.DataType.ToString().ToUpper() == "SYSTEM.DOUBLE") &&
                            ((gcQueryList.Caption.IndexOf("金额") >= 0) || (gcQueryList.Caption.IndexOf("价格") >= 0)
                            || (gcQueryList.Caption.IndexOf("人民币") >= 0) || (gcQueryList.Caption.IndexOf("美元") >= 0)
                            || (gcQueryList.Caption.IndexOf("单价") >= 0) || (gcQueryList.Caption.IndexOf("个") >= 0)
                            || (gcQueryList.Caption.IndexOf("件") >= 0) || (gcQueryList.Caption.IndexOf("箱") >= 0)
                            || (gcQueryList.Caption.IndexOf("数量") >= 0)) && iMSumItemNum < 1)
                        {
                            iMSumItemNum++;
                            gcQueryList.SummaryItem.FieldName = _dcQuery.ColumnName;
                            gcQueryList.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                            gvMainList.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, _dcQuery.ColumnName, null, "  小计:{0}");

}
                        else if ((_dcQuery.DataType.ToString().ToUpper() == "SYSTEM.DECIMAL" || _dcQuery.DataType.ToString().ToUpper() == "SYSTEM.STRING") &&
                           ((gcQueryList.Caption.IndexOf("序号") >= 0) || (gcQueryList.Caption.IndexOf("流水") >= 0)
                            || (gcQueryList.Caption.IndexOf("ID") >= 0) || (gcQueryList.Caption.IndexOf("编号") >= 0)
                            || (gcQueryList.Caption.IndexOf("箱号") >= 0) || (gcQueryList.Caption.IndexOf("尺寸") >= 0)
                            || (gcQueryList.Caption.IndexOf("序") >= 0) || (gcQueryList.Caption.IndexOf("单号") >= 0)) && iMCountItemNum < 1)
                        {
                            iMCountItemNum++;
                            gcQueryList.SummaryItem.FieldName = _dcQuery.ColumnName;
                            gcQueryList.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Count;
                            gvMainList.GroupSummary.Add(DevExpress.Data.SummaryItemType.Count, _dcQuery.ColumnName, null, "  小计:{0}");
                        }

if (gcQueryList.FieldName != null && RelaitionField != null && gcQueryList.FieldName.ToUpper() != RelaitionField.ToUpper())
                        {
                            gcQueryList.VisibleIndex = iVisible;
                            gcQueryList.Visible = true;
                        }
                        else
                        {
                            gcQueryList.VisibleIndex = -1;
                            gcQueryList.Visible = false;
                        }
                        //gcQueryList.ColumnEdit.ReadOnly = true;
                        gvMainList.Columns.Add(gcQueryList);
                    }
                }
                gcMainList.MainView = gvMainList;

}
            catch (System.Exception ex)
            {
                MsgBox.ErrorMsg("执行查询失败! 失败原因:" + ex.Message);
            }
            #endregion

#region 子表构造字段
            try
            {
                //获取到表结构。
                if (_dtQuery.Tables["DE"].Rows.Count >= 0)
                {
                    DevExpress.XtraGrid.Views.Grid.GridView gvMainDetail = new DevExpress.XtraGrid.Views.Grid.GridView();
                   // gvMainDetail.Columns.Clear();
                   // gvMainDetail.GroupSummary.Clear();
                   // gvMainDetail.ClearGrouping();
                   // gvMainDetail.OptionsBehavior.Editable = true;

int iVisible = 0;
                    //根据表结构动态加载到GridControl控件中。
                    foreach (DataColumn _dcQueryDetail in _dtQuery.Tables["DE"].Columns)
                    {
                        iVisible++;
                        //动态添加
                        DevExpress.XtraGrid.Columns.GridColumn gcDetialQueryList = new DevExpress.XtraGrid.Columns.GridColumn();
                        gcDetialQueryList.Name = "_dcD" + _dcQueryDetail.ColumnName.ToUpper();
                        gcDetialQueryList.Caption = _dcQueryDetail.ColumnName;
                        gcDetialQueryList.FieldName = _dcQueryDetail.ColumnName;

//数字类型
                        if ((_dcQueryDetail.DataType.ToString().ToUpper() == "SYSTEM.DECIMAL" || _dcQueryDetail.DataType.ToString().ToUpper() == "SYSTEM.DOUBLE") &&
                            ((gcDetialQueryList.Caption.IndexOf("金额") >= 0) || (gcDetialQueryList.Caption.IndexOf("价格") >= 0)
                            || (gcDetialQueryList.Caption.IndexOf("人民币") >= 0) || (gcDetialQueryList.Caption.IndexOf("美元") >= 0)
                            || (gcDetialQueryList.Caption.IndexOf("单价") >= 0) || (gcDetialQueryList.Caption.IndexOf("个") >= 0)
                            || (gcDetialQueryList.Caption.IndexOf("件") >= 0) || (gcDetialQueryList.Caption.IndexOf("箱") >= 0)
                            || (gcDetialQueryList.Caption.IndexOf("数量") >= 0)) && iDSumItemNum < 1)
                        {
                            iDSumItemNum++;
                            gcDetialQueryList.SummaryItem.FieldName = _dcQueryDetail.ColumnName;
                            gcDetialQueryList.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Sum;
                            gvMainDetail.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, _dcQueryDetail.ColumnName, null, "  小计:{0}");

}
                        else if ((_dcQueryDetail.DataType.ToString().ToUpper() == "SYSTEM.DECIMAL" || _dcQueryDetail.DataType.ToString().ToUpper() == "SYSTEM.STRING") &&
                           ((gcDetialQueryList.Caption.IndexOf("序号") >= 0) || (gcDetialQueryList.Caption.IndexOf("流水") >= 0)
                            || (gcDetialQueryList.Caption.IndexOf("ID") >= 0) || (gcDetialQueryList.Caption.IndexOf("编号") >= 0)
                            || (gcDetialQueryList.Caption.IndexOf("箱号") >= 0) || (gcDetialQueryList.Caption.IndexOf("尺寸") >= 0)
                            || (gcDetialQueryList.Caption.IndexOf("序") >= 0) || (gcDetialQueryList.Caption.IndexOf("单号") >= 0)) && iDCountItemNum < 1)
                        {
                            iDCountItemNum++;
                            gcDetialQueryList.SummaryItem.FieldName = _dcQueryDetail.ColumnName;
                            gcDetialQueryList.SummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Count;
                            gvMainDetail.GroupSummary.Add(DevExpress.Data.SummaryItemType.Count, _dcQueryDetail.ColumnName, null, "  小计:{0}");
                        }

if (gcDetialQueryList.FieldName != null && RelaitionField != null && gcDetialQueryList.FieldName.ToUpper() != RelaitionField.ToUpper())
                        {
                            gcDetialQueryList.VisibleIndex = iVisible;
                            gcDetialQueryList.Visible = true;
                        }
                        else
                        {
                            gcDetialQueryList.VisibleIndex = -1;
                            gcDetialQueryList.Visible = false;
                        }
                        //gcDetialQueryList.ColumnEdit.ReadOnly = true;
                        
                       gvMainDetail.Columns.Add(gcDetialQueryList);

}

gcMainList.ViewCollection.Add(gvMainDetail);
                }

}
            catch (System.Exception ex)
            {
                MsgBox.ErrorMsg("执行查询失败! 失败原因:" + ex.Message);
            }
            #endregion

#region 建立关系并填充数据源
           _dtQuery.Relations.Add("RMD", _dtQuery.Tables["MA"].Columns[RelaitionField], _dtQuery.Tables["DE"].Columns[RelaitionField], false);
            gcMainList.DataSource = _dtQuery.Tables["MA"];
            gvMainList.BestFitColumns();
            #endregion
        }
        #endregion

效果如图:

DevExpress GridControl 动态创建字段及主细关系表过程的更多相关文章

  1. odoo 动态创建字段的方法

    动态创建字段并非一个常见的的需求,但某些情况下,我们确实又需要动态地创建字段. Odoo 中创建字段的方法有两种,一种是通过python文件class中进行定义,另一种是在界面上手工创建,odoo通过 ...

  2. 内存表 FDMemTable ClientDataSet CreateDataSet 动态创建字段

    https://community.embarcadero.com/index.php/blogs/entry/firedac-in-memory-dataset-tfdmemtable Client ...

  3. C#动态创建和动态使用程序集、类、方法、字段等

    C#动态创建和动态使用程序集.类.方法.字段等 分类:技术交流 (3204)  (3)   首先需要知道动态创建这些类型是使用的一些什么技术呢?其实只要相关动态加载程序集呀,类呀,都是使用反射,那么动 ...

  4. silverlight依据json字符串动态创建实体类

    1.接收json字符串: //用JsonValue转换json字符串是为了之后获得json字符串的每行数据和每一列的列名 JsonValue jv = JsonValue.Parse(json);   ...

  5. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  6. Devexpress datagrid动态添加显示指定列的gridView

    代码如下: public class DXGridControlHelper { /// <summary> /// 获取显示指定列的GridView /// </summary&g ...

  7. DevExpress GridControl 使用方法技巧 总结 收录整理

    一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 ().gridView.AddNe ...

  8. DevExpress GridControl使用(转)

    DevExpress GridControl使用 (一)原汁原味的表格展示 Dev控件中的表格控件GridControl控件非常强大.不过,一些细枝末节的地方有时候用起来不好找挺讨厌的.使用过程中,多 ...

  9. C# DevExpress GridControl使用方法

    一.如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 二.如何新增一条记录 ().gridView.AddNe ...

随机推荐

  1. MVC扩展控制器工厂,通过实现IControllerFactory,根据action名称生成不同的Controller

    关于控制器工厂的扩展,要么通过实现IControllerFactory接口,要么通过继承DefaultControllerFactory.本篇中,我想体验的是: 1.当请求经过路由,controlle ...

  2. memcached-session-manager配置

    原文地址: http://chenzhou123520.iteye.com/blog/1650212 声明:本篇文章是根据memcached-session-manager官方配置方法wiki页面翻译 ...

  3. 防火墙 0x80070422

    1.无法打开操作中心-安全服务,解决方法:控制面板->管理工具->服务,找到Security Center 服务,双击打开,查看启动类型是否设置成禁用,是的话更改成自动或者延迟启动,之后就 ...

  4. Spark一个简单案例

    Spark是一个类似Map-Reduce的集群计算框架,用于快速进行数据分析. 在这个应用中,我们以统计包含"the"字符的行数为案例,.为建立这个应用,我们使用 Spark 1. ...

  5. MySQL冷知识

    问题:在网站后台添加了扩展字段后,对于数据库表不太熟悉的,可能会花较长时间查找,如何有效提高我们的工作效率呢? 解决方法:利用SQL语句来查询字段所在的表

  6. pat 1060 比较科学计数法

    trick: 1.前导0 如:000001,000.000001 2.出现0时也要按照科学计数法输出 e.g. 4 00000.00000 0001 NO 0.0000*10^0 0.1*10^1 3 ...

  7. Cesium随笔(5)CZML介绍(介个文章是转的嘿嘿)【转】

    通过czml可以在cesium上实现非常棒的动态效果 (1)Cesium Language (CZML) 入门--CZML Structure(CZML的结构) 原文地址:https://github ...

  8. 使用WPF来创建 Metro UI

    当我第一次运行Zune时,我为这些美丽的UI所折服.当时就说这肯定不是用WPF做的,因为这些字体是如此的清晰而且UI反映的也非常快速..而且我从维基百科上也了解到Zune的第一个版本是2006年发布的 ...

  9. IOS Xib使用——Xib表示局部界面

    Xib文件是一个轻量级的用来描述局部界面的文件,在之前的文章讲解了为控制器添加Xib文件,本节主要讲解一下通过xib文件表示局部界面. <一> 创建Xib文件 Xib文件创建的时候是选择U ...

  10. NYOJ-267 郁闷的C小加(二)

    郁闷的C小加(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很 ...