o任飘零o

别人给了你一滴水,你给了别人些什么?
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Datagridview 实现二维表头

Posted on 2013-02-04 14:31  o任飘零o  阅读(304)  评论(0)    收藏  举报
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;
                    }
                }
            }

        }