首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

datagrivdview中同一列或同一行中相临的单元格中相同是怎样合并成一个单元格,该如何处理

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

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 

热点排行