winForm中如何实现这样的效果
查询时,如何在DataGrid中显示出如下的表头   
    
  ___________________________________   
  |        合     计              |   
  |_________________________________|   
  |1999年度          |    2000年度     |     
  |_______________ |________________|     
    
   
如果有第三方控件请告之小弟下载地址,拒绝web模式

解决方案 »

  1.   

    你可以用TabControl多标签控件啊
      

  2.   

    为什么非要用一个DataGrid呢?
      

  3.   

    合并单元格
    在CellPainting事件里面重绘
      

  4.   

    C# 合并单元格参考:
    http://www.cnblogs.com/xiongeee/archive/2007/03/08/667962.html
      

  5.   

    这个得要重绘了,自已得写程序来合并单元格,给个参考的合并代码:private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
            {
                // 对第1列相同单元格进行合并
                if (e.ColumnIndex == 0 && e.RowIndex != -1)
                {
                    using
                        (
                        Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
                        backColorBrush = new SolidBrush(e.CellStyle.BackColor)
                        )
                    {
                        using (Pen gridLinePen = new Pen(gridBrush))
                        {
                            // 清除单元格
                            e.Graphics.FillRectangle(backColorBrush, e.CellBounds);                        // 画 Grid 边线(仅画单元格的底边线和右边线)
                            //   如果下一行和当前行的数据不同,则在当前的单元格画一条底边线
                            if (e.RowIndex < dataGridView1.Rows.Count - 1 &&
                            dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString() != 
                            e.Value.ToString())
                                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                                e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,
                                e.CellBounds.Bottom - 1);
                            // 画右边线
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
                                e.CellBounds.Top, e.CellBounds.Right - 1,
                                e.CellBounds.Bottom);                        // 画(填写)单元格内容,相同的内容的单元格只填写第一个
                            if (e.Value != null)
                            {
                                if (e.RowIndex > 0 &&
                                dataGridView1.Rows[e.RowIndex - 1].Cells[e.ColumnIndex].Value.ToString() == 
                                e.Value.ToString())
                                { }
                                else
                                {
                                    e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
                                        Brushes.Black, e.CellBounds.X + 2,
                                        e.CellBounds.Y + 5, StringFormat.GenericDefault);
                                }
                            }
                            e.Handled = true;
                        }
                    }
                }
            }
    不过这样的话,数据多的时候,性能会受到点影响可以的话,尽量改其它控件吧
      

  6.   

    http://hi.baidu.com/anymis/blog/item/e7ebc9544b871c58d00906f6.html
      

  7.   

    倒...你baidu google 一下不就出来了,网上一大把C#中DataGridView多層表頭的制作(2)
    http://blog.csdn.net/manimanihome/archive/2008/03/31/2233573.aspx
      

  8.   

    后面还有个用tree的
    http://blog.csdn.net/teacatcn/archive/2008/01/23/2060482.aspx
      

  9.   

    private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
            {
                // 对第1列相同单元格进行合并
                if (e.ColumnIndex == 0 && e.RowIndex != -1)
                {
                    using
                        (
                        Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
                        backColorBrush = new SolidBrush(e.CellStyle.BackColor)
                        )
                    {
                        using (Pen gridLinePen = new Pen(gridBrush))
                        {
                            // 清除单元格
                            e.Graphics.FillRectangle(backColorBrush, e.CellBounds);                        // 画 Grid 边线(仅画单元格的底边线和右边线)
                            //   如果下一行和当前行的数据不同,则在当前的单元格画一条底边线
                            if (e.RowIndex < dataGridView1.Rows.Count - 1 &&
                            dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString() != 
                            e.Value.ToString())
                                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                                e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,
                                e.CellBounds.Bottom - 1);
                            // 画右边线
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
                                e.CellBounds.Top, e.CellBounds.Right - 1,
                                e.CellBounds.Bottom);                        // 画(填写)单元格内容,相同的内容的单元格只填写第一个
                            if (e.Value != null)
                            {
                                if (e.RowIndex > 0 &&
                                dataGridView1.Rows[e.RowIndex - 1].Cells[e.ColumnIndex].Value.ToString() == 
                                e.Value.ToString())
                                { }
                                else
                                {
                                    e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
                                        Brushes.Black, e.CellBounds.X + 2,
                                        e.CellBounds.Y + 5, StringFormat.GenericDefault);
                                }
                            }
                            e.Handled = true;
                        }
                    }
                }
            }
    不过这样的话,数据多的时候,性能会受到点影响 可以的话,尽量改其它控件吧
      

  10.   

    我们公司用的是DevExpress控件,买的
      

  11.   

    用table不是一样的绑定麻?比datagrid还灵活方便点。用一个datatable读出来要的数据,循环一行一行的绑定
      

  12.   

    定义DataGridViewColumn
    参考
    http://www.cnblogs.com/xzcxlyh/archive/2007/03/10/664049.html
    http://blog.csdn.net/zhangzeshuai/archive/2008/09/12/2916103.aspx
      

  13.   

    http://www.cnblogs.com/wf5360308/articles/1202615.html
      

  14.   

    http://download.csdn.net/source/851125  
    这里面有个自定义表头的类,直接引用就可以了,支持多级表头  
    呵呵  
      

  15.   

    DataGrid还有这种用法啊,还不知道呢?
      

  16.   

    用spread for windows forms 4,功能挺强大,长得跟EXCEL似的
      

  17.   

    不收费的,我一直用FarPoint Spread来做多表头的查询界面的。它有支持VB的、支持.NET的各种版本。
      

  18.   

    tabpage + tabcontrol可以实现的
      

  19.   

    本身的控件做复合表头不好做,推荐用三方控件farpoint spread