DataGridView实现多维表头

转自:http://www.cnblogs.com/greatverve/archive/2012/03/05/multi-datagridview.html


拿来主义吧,先满足我的需求再说。
dataGridView1.RowHeadersVisible = false;
把整行选中那一列去掉。如果需要整行选中,新增一按钮列模拟实现。
上源码: 多维DataGridView
有个简易的方法:
1,继承DataGridView,添加表头信息类。
  2,添加CellPainting,代码如下:
复制代码
private  void DataGridViewEx_CellPainting( object sender, DataGridViewCellPaintingEventArgs e)
{
     if (e.RowIndex == - 1)
    {
         //    int w = dataGridView1.HorizontalScrollingOffset + dataGridView1.TopLeftHeaderCell.Size.Width + dataGridView1.Columns[0].Width + 10;


        Rectangle newRect =  new Rectangle(e.CellBounds.X +  1,
        e.CellBounds.Y +  1, e.CellBounds.Width -  4,
        e.CellBounds.Height -  4);

         using (
            Brush gridBrush =  new SolidBrush( this.GridColor),
            backColorBrush =  new SolidBrush(e.CellStyle.BackColor))
        {
             using (Pen gridLinePen =  new Pen(gridBrush))
            {
                 //  Erase the cell.
                e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                 //  Draw the grid lines (only the right and bottom lines;
                
//  DataGridView takes care of the others).
                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                    e.CellBounds.Bottom -  1, e.CellBounds.Right -  1,
                    e.CellBounds.Bottom -  1);
                 if (e.ColumnIndex > - 1 && topRow !=  null && topRow.Cells[e.ColumnIndex].ColSpan >  1)
                {
                    e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right -  1,
                        e.CellBounds.Top + e.ClipBounds.Height /  2, e.CellBounds.Right -  1,
                        e.CellBounds.Bottom);
                }
                 else
                {
                    e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right -  1,
                                                    e.CellBounds.Top, e.CellBounds.Right -  1,
                                                    e.CellBounds.Bottom);
                }

                 //  Draw the inset highlight box.
                
//    e.Graphics.DrawRectangle(Pens.Blue, newRect);

                 int scale = e.CellBounds.Height /  3;
                 if (e.ColumnIndex > - 1 && topRow.Cells[e.ColumnIndex].Text !=  null)
                {
                    scale = e.CellBounds.Height /  2;
                    e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - e.CellBounds.Height /  2, e.CellBounds.Right, e.CellBounds.Bottom - e.CellBounds.Height /  2);
                }
                 //  Draw the text content of the cell, ignoring alignment.



                 if (e.Value !=  null)
                {
                    e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font,
                        Brushes.Crimson, e.CellBounds.X +  2,
                        e.CellBounds.Y + scale +  2, StringFormat.GenericDefault);



                }




                 if (e.ColumnIndex > - 1 && topRow.Cells[e.ColumnIndex].RelateIndex > - 1 && topRow.Cells[e.ColumnIndex].Text !=  null)
                {
                    Rectangle recCell =  new Rectangle(e.CellBounds.X -  1 - topRow.Cells[e.ColumnIndex].SpanRowWith,
    e.CellBounds.Y +  1, topRow.Cells[e.ColumnIndex].SpanRowWith,
    e.CellBounds.Height /  2);


                    StringFormat sf =  new StringFormat();

                    sf.Alignment = StringAlignment.Center;


                    e.Graphics.DrawString(topRow.Cells[e.ColumnIndex].Text, e.CellStyle.Font, Brushes.Crimson, recCell, sf);

                }

                e.Handled =  true;
            }
        }
    }

}
复制代码
3,调用方法
  dataGridViewEx1.TopRow.Cells[2].Text = "入库";
            dataGridViewEx1.TopRow.Cells[2].ColSpan = 2;


            dataGridViewEx1.TopRow.Cells[4].Text = "出库";
            dataGridViewEx1.TopRow.Cells[4].ColSpan = 2;
4,效果图


至于表尾合计,也做出了原型。二维表头+表尾合计,基本上满足需求了。
url: http://greatverve.cnblogs.com/archive/2012/03/05/Multi-DataGridView.html

1.DataGridView实现课程表 testcontrol.rar

2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHeaderDgv.rar



3.DataGridView单元格显示GIF图片 gifanimationindatagrid.rar

4.自定义显示DataGridView列(行头显示行号与图标,同一单元格显示图片也显示文字)TestDataGridViewRowStyle2.rar

5.扩展DataGridView功能



相关文章

datagridview

DataGridView 说明

DataGridView绑定

DataGridView的一些技巧

DataGridView常见用法和FAQ汇总

CheckBox Header Column For DataGridView

DataGridView填充、更新、删除(多行)Sql Express 2005数据库

Datagridview 实现二维表头

如何于DataGridView中使用计算字段

DataGridView 数据绑定的一般过程

DataGridView扩展的一些想法(二维表头、合并单元格、合计行)

Winform DataGridView数据绑定问题

DataGridView分页功能的实现

WINFORM的DataGridView使用点滴

在DataGridView控件中加入ComboBox下拉列表框的实现

DataGridView中虚拟模式(Virtual Mode)的使用

C# DataGridView 小技巧

让DataGridView显示行号

DataGridView隔行显示不同的颜色

扩展 DataGridView 的功能(一)

从 DataGridView 控件 托放数据 到 TreeView控件

 

相关一些资料下载(收集自网络)

微软提供的例子                        datagridviewsamples.rar

DataGridView使用文档              DataGridView_Doc.rar

Excel与DataGridView互导数据    Excl导入datagridview.rar

DataGridView编程36计.pdf

DataGridView扩展功能代码
--------------------------------------------------------------------------
还有用第三方控件的:

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

1、常用多表头制作方法

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

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

     c、DataGridView实现多维表头

2、DataGridView多维表头实现原理

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

3、调用方法 


       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、界面显示

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

 

凡事以大气象去面对,优秀是一种习惯。

分类:  winForm

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 WinForms 的 DataGridView 控件中,可以通过使用 ColumnHeader 属性来实现表头。具体步骤如下: 1. 设置控件的 ColumnHeadersVisible 属性为 false,这将隐藏默认的表头。 2. 添加自定义表头。可以使用 DataGridViewColumn 对象来创建列,然后使用 DataGridView.Columns.Add 方法将列添加到控件中。每个列可以包含一个或多个子列,用于创建自定义表头。 3. 设置每个列的 HeaderCell 属性为 DataGridViewColumnHeaderCell 对象。这将使该列的默认表头与自定义表头分离。 4. 设置每个子列的 HeaderCell 属性为 DataGridViewColumnHeaderCell 对象。这将使该子列的默认表头与自定义表头分离,并将其添加到相应的列中。 下面是一个简单的示例代码,用于创建一个带有两个表头DataGridView 控件: ```csharp // 隐藏默认表头 dataGridView1.ColumnHeadersVisible = false; // 创建第一级表头 DataGridViewColumn column1 = new DataGridViewTextBoxColumn(); column1.HeaderText = "表头1"; column1.Name = "Column1"; dataGridView1.Columns.Add(column1); // 创建第二级表头 DataGridViewColumn subColumn1 = new DataGridViewTextBoxColumn(); subColumn1.HeaderText = "子表头1"; subColumn1.Name = "SubColumn1"; DataGridViewColumn subColumn2 = new DataGridViewTextBoxColumn(); subColumn2.HeaderText = "子表头2"; subColumn2.Name = "SubColumn2"; column1.HeaderCell = new DataGridViewColumnHeaderCell(); column1.HeaderCell.Value = "表头1"; column1.HeaderCell.Style.Font = new Font(dataGridView1.Font, FontStyle.Bold); column1.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter; column1.HeaderCell.Style.BackColor = Color.LightGray; column1.HeaderCell.Style.WrapMode = DataGridViewTriState.True; column1.HeaderCell.Style.Padding = new Padding(2, 2, 2, 2); column1.HeaderCell.Style.SelectionBackColor = Color.DarkGray; column1.HeaderCell.Style.SelectionForeColor = Color.White; column1.HeaderCell.Style.SelectionBorderWidth = 2; column1.HeaderCell.Style.SelectionBorderColor = Color.Black; column1.HeaderCell.Style.SelectionFont = new Font(dataGridView1.Font, FontStyle.Bold); column1.HeaderCell.Style.SelectionAlignment = DataGridViewContentAlignment.MiddleCenter; subColumn1.HeaderCell = new DataGridViewColumnHeaderCell(); subColumn1.HeaderCell.Value = "子表头1"; subColumn2.HeaderCell = new DataGridViewColumnHeaderCell(); subColumn2.HeaderCell.Value = "子表头2"; column1.DataGridView.Columns.AddRange(new DataGridViewColumn[] { subColumn1, subColumn2 }); ``` 在这个示例中,我们创建了一个带有两个表头DataGridView 控件,并将其添加到窗体上。第一级表头为“表头1”,第二级表头包含两个子列:“子表头1”和“子表头2”。我们还设置了一些样式属性,以更改表头的外观和行为。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值