DataGridView实现多维表头

在做信息管理系统时,很多中式报表都是多维的,要实现报表数据显示,通常要用到多维表头。然而,非常遗憾的是,Winform中DataGrid、DataGridView本身不提供多维表头设计,要实现多维报表只好利用第三方的控件。通过对DataGridView的扩展,利用标题行进行重绘,可实现多维表头的友好界面。下面是对多维表头的探讨和实现。

1、常用多表头制作方法

     a.第三方控件实现多维表头:FlexGrid--展示效果很好,就是数据量大加载时显示速度较慢。

     b.报表方式实现多维表头:CrystalReport、Grid++Report--通过预览方式实现数据显示

     c、DataGridView实现多维表头

2、DataGridView多维表头实现原理

     通过重绘标题栏进行多栏实现,通过RowSpan和ColSpan来进行合并,类似Html的Table实现方式。

3、调用方法 

ContractedBlock.gif ExpandedBlockStart.gif Code
       private void Form1_Load(object sender, EventArgs e)
        {
            InitDataTable();
            InitDataGridView();
        }

        DataTable table 
= new DataTable();

        
private void InitDataTable()
        {          

            DataColumn col;

            col 
= new DataColumn();
            col.ColumnName 
= "客户名称";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "产品名称";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "规格";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "单位";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "期初存货数量";
            col.DataType 
= System.Type.GetType("System.Decimal");
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "期初货款";
            col.DataType 
= System.Type.GetType("System.Decimal");
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "期初帐款";
            col.DataType 
= System.Type.GetType("System.Decimal");
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "发货数量";
            col.DataType 
= System.Type.GetType("System.Decimal");
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "发货金额";
            col.DataType 
= System.Type.GetType("System.Decimal");
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "开票数量";
            col.DataType 
= System.Type.GetType("System.Decimal");
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "开票金额";
            col.DataType 
= System.Type.GetType("System.Decimal");
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.ColumnName 
= "回款数量";
            col.DataType 
= System.Type.GetType("System.Decimal");
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.DataType 
= System.Type.GetType("System.Decimal");
            col.ColumnName 
= "回款金额";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.DataType 
= System.Type.GetType("System.Decimal");
            col.ColumnName 
= "未开票回款数量";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.DataType 
= System.Type.GetType("System.Decimal");
            col.ColumnName 
= "未开票回款金额";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.DataType 
= System.Type.GetType("System.Decimal");
            col.ColumnName 
= "期末存货数量";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.DataType 
= System.Type.GetType("System.Decimal");
            col.ColumnName 
= "期末应收货款";
            table.Columns.Add(col);

            col 
= new DataColumn();
            col.DataType 
= System.Type.GetType("System.Decimal");
            col.ColumnName 
= "期末应收帐款";
            table.Columns.Add(col);
        }

        
private void  InitDataGridView()
        {
            MutilGridHeader topRow 
= new MutilGridHeader();
            topRow.SetRowCol(
318);

            
//第一行
            topRow.Cells[0][0].Value = "客户";
            topRow.Cells[
0][0].RowSpan = 3;

            topRow.Cells[
0][1].Value = "产品名称";
            topRow.Cells[
0][1].RowSpan = 3;

            topRow.Cells[
0][2].Value = "规格";
            topRow.Cells[
0][2].RowSpan = 3;

            topRow.Cells[
0][3].Value = "单位";
            topRow.Cells[
0][3].RowSpan = 3;

            topRow.Cells[
0][4].Value = "期初";
            topRow.Cells[
0][4].ColSpan = 3;

            topRow.Cells[
0][7].Value = "本期";
            topRow.Cells[
0][7].ColSpan = 8;

            topRow.Cells[
0][15].Value = "期末";
            topRow.Cells[
0][15].ColSpan = 3;


            
//第二行
            topRow.Cells[1][4].Value = "存货数量";
            topRow.Cells[
1][4].RowSpan = 2;

            topRow.Cells[
1][5].Value = "应收货款";
            topRow.Cells[
1][5].RowSpan = 2;

            topRow.Cells[
1][6].Value = "应收帐款";
            topRow.Cells[
1][6].RowSpan = 2;

            topRow.Cells[
1][7].Value = "发货";
            topRow.Cells[
1][7].ColSpan = 2;

            topRow.Cells[
1][9].Value = "开票";
            topRow.Cells[
1][9].ColSpan = 2;

            topRow.Cells[
1][11].Value = "回款";
            topRow.Cells[
1][11].ColSpan = 2;

            topRow.Cells[
1][13].Value = "未开票回款";
            topRow.Cells[
1][13].ColSpan = 2;

            topRow.Cells[
1][15].Value = "存货数量";
            topRow.Cells[
1][15].RowSpan = 2;

            topRow.Cells[
1][16].Value = "应收货款";
            topRow.Cells[
1][16].RowSpan = 2;

            topRow.Cells[
1][17].Value = "应收票款";
            topRow.Cells[
1][17].RowSpan = 2;

            
//第三行
            topRow.Cells[2][7].Value = "数量";
            topRow.Cells[
2][8].Value = "金额";
            topRow.Cells[
2][9].Value = "数量";
            topRow.Cells[
2][10].Value = "金额";
            topRow.Cells[
2][11].Value = "数量";
            topRow.Cells[
2][12].Value = "金额";
            topRow.Cells[
2][13].Value = "数量";
            topRow.Cells[
2][14].Value = "金额";


            dataGridViewEx1.Header 
= topRow;
            dataGridViewEx1.DataSource 
= table;
            table.DefaultView.AllowNew 
= false;

            dataGridViewEx1.Columns[
0].Width = 120;
            dataGridViewEx1.Columns[
1].Width = 100;
            dataGridViewEx1.Columns[
2].Width = 80;
            
for(int i = 2;i<18;i++)
                dataGridViewEx1.Columns[i].Width 
= 60;

        }

4、界面显示

      这段代码是两年前写的,由于当时时间和编程水平有限,很多代码段没有加注释,代码的可读性极差,只是为了达到效果,具体合并的实现方法自己也已模糊。

转载于:https://www.cnblogs.com/windsea123/archive/2009/03/31/1426127.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值