读书人

datagrivdview中同一列或同一行中相临

发布时间: 2012-01-21 21:31:43 作者: rapoo

datagrivdview中同一列或同一行中相临的单元格中相同是怎样合并成一个单元格
datagrivdview中同一列或同一行中相临的单元格中相同是怎样合并成一个单元格

[解决办法]

C# code
   private int? nextrow = null;        private int? nextcol = null;        private void dataGridView1_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)        {            if (this.dataGridView1.Columns["description"].Index == e.ColumnIndex && e.RowIndex >= 0)            {                if (this.nextcol != null & e.ColumnIndex == this.nextcol)                {                    e.CellStyle.BackColor = Color.LightBlue;                    this.nextcol = null;                }                if (this.nextrow != null & e.RowIndex == nextrow)                {                    e.CellStyle.BackColor = Color.LightPink;                    this.nextrow = null;                }                if (e.RowIndex != this.dataGridView1.RowCount - 1)                {                    if (e.Value.ToString() == this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString())                    {                        e.CellStyle.BackColor = Color.LightPink;                        nextrow = e.RowIndex + 1;                    }                }            }            if (this.dataGridView1.Columns["name"].Index == e.ColumnIndex && e.RowIndex >= 0)            {                if (e.Value.ToString() == this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value.ToString())                {                    e.CellStyle.BackColor = Color.LightBlue;                    nextcol = e.ColumnIndex + 1;                }            }        }        //==========================               //绘制单元格        private void dataGridView1_CellPainting(object sender, System.Windows.Forms.DataGridViewCellPaintingEventArgs e)        {             //纵向合并            if (this.dataGridView1.Columns["description"].Index == e.ColumnIndex && e.RowIndex >= 0)            {                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);                        /**/////绘制线条,这些线条是单元格相互间隔的区分线条,                        ////因为我们只对列name做处理,所以datagridview自己会处理左侧和上边缘的线条                        if (e.RowIndex != this.dataGridView1.RowCount - 1)                        {                            if (e.Value.ToString() != this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString())                            {                                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,                                e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);//下边缘的线                                //绘制值                                if (e.Value != null)                                {                                    e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,                                        Brushes.Crimson, e.CellBounds.X + 2,                                        e.CellBounds.Y + 2, StringFormat.GenericDefault);                                }                            }                        }                        else                        {                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,                                e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);//下边缘的线                            //绘制值                            if (e.Value != null)                            {                                e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,                                    Brushes.Crimson, e.CellBounds.X + 2,                                    e.CellBounds.Y + 2, StringFormat.GenericDefault);                            }                        }                        //右侧的线                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,                            e.CellBounds.Top, e.CellBounds.Right - 1,                            e.CellBounds.Bottom - 1);                        e.Handled = true;                    }                }            }            //横向合并            if (this.dataGridView1.Columns["name"].Index == e.ColumnIndex && e.RowIndex >= 0)            {                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);                        if (e.Value.ToString() != this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value.ToString())                        {                            //右侧的线                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top,                                e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);                            //绘制值                            if (e.Value != null)                            {                                e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,                                    Brushes.Crimson, e.CellBounds.X + 2,                                    e.CellBounds.Y + 2, StringFormat.GenericDefault);                            }                        }                        //下边缘的线                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,                                                    e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);                        e.Handled = true;                    }                }            }        } 


e.Graphics.FillRectangle(backColorBrush, e.CellBounds)
'
'''/绘制线条,这些线条是单元格相互间隔的区分线条,
'''/因为我们只对列name做处理,所以datagridview自己会处理左侧和上边缘的线条
If e.RowIndex <> Me.dataGridView1.RowCount - 1 Then
If e.Value.ToString() <> Me.dataGridView1.Rows(e.RowIndex + 1).Cells(e.ColumnIndex).Value.ToString() Then

e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
'下边缘的线
'绘制值
If e.Value IsNot Nothing Then
e.Graphics.DrawString(DirectCast(e.Value, String), e.CellStyle.Font, Brushes.Crimson, e.CellBounds.X + 2, e.CellBounds.Y + 2, StringFormat.GenericDefault)
End If
End If
Else
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
'下边缘的线
'绘制值
If e.Value IsNot Nothing Then
e.Graphics.DrawString(DirectCast(e.Value, String), e.CellStyle.Font, Brushes.Crimson, e.CellBounds.X + 2, e.CellBounds.Y + 2, StringFormat.GenericDefault)
End If
End If
'右侧的线
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)

e.Handled = True
End Using
End Using
End If

'横向合并
If Me.dataGridView1.Columns("name").Index = e.ColumnIndex AndAlso e.RowIndex >= 0 Then

Using gridBrush As Brush = New SolidBrush(Me.dataGridView1.GridColor), backColorBrush As Brush = New SolidBrush(e.CellStyle.BackColor)
Using gridLinePen As New Pen(gridBrush)
' 擦除原单元格背景
e.Graphics.FillRectangle(backColorBrush, e.CellBounds)

If e.Value.ToString() <> Me.dataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex + 1).Value.ToString() Then

'右侧的线
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
'绘制值
If e.Value IsNot Nothing Then
e.Graphics.DrawString(DirectCast(e.Value, String), e.CellStyle.Font, Brushes.Crimson, e.CellBounds.X + 2, e.CellBounds.Y + 2, StringFormat.GenericDefault)
End If
End If

'下边缘的线
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
e.Handled = True
End Using
End Using

End If

End Sub

读书人网 >VB Dotnet

热点推荐