datagridview 列 纵向合并 ,看了别人的源码拿过来自己搞搞

效果

 

View Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    
public partial class Form1 : Form
    {
        
public Form1()
        {
            InitializeComponent();
        }

        
public override string ToString()
        {
            
return Convert.ToString(base.ToString());
        }

        
#region "合并单元格的测试"
        
//private int? nextrow = null;
        
//private int? nextcol = null;

        
//  设置单元格内容显示格式
        private void dataGridView1_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
        {
            
//#region description
            
//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() == Convert.ToString(this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex + 1].Value))
            
//        {
            
//            e.CellStyle.BackColor = Color.LightPink;
            
//            nextrow = e.RowIndex + 1;

            
//        }
            
//    }
            
//}
            
//#endregion

            
//if (this.dataGridView1.Columns["name"].Index == e.ColumnIndex && e.RowIndex >= 0)
            
//{
            
//    // upd by liu
            
//    if (e.Value.ToString() == this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString())
            
//    {
            
//        e.CellStyle.BackColor = Color.LightBlue;
            
//        nextcol = e.ColumnIndex + 1;
            
//    }
            
//}
        }
        
//==========================

        
// 记录合并的行数
        static int rowcount = 0;
        
//绘制单元格
        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(Color.Red),//this.dataGridView1.GridColor
                     backColorBrush = new SolidBrush(e.CellStyle.BackColor)
                    )
                {
                    
using (Pen gridLinePen = new Pen(gridBrush))
                    {
                        
// 擦除原单元格背景
                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
                        
/**/
                        
////绘制线条,这些线条是单元格相互间隔的区分线条,
                        
////因为我们只对列description做处理,所以datagridview自己会处理左侧和上边缘的线条
                        
////相邻单元格的值一样的话,就不在画下边缘的线,实现合并效果
                        if (e.RowIndex != this.dataGridView1.RowCount - 1)
                        {
                            
if (e.Value.ToString() != Convert.ToString(this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value))
                            {
                                e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom 
- 1,
                                e.CellBounds.Right 
- 1, e.CellBounds.Bottom - 1);//下边缘的线
                                
//绘制值
                                if (e.Value != null)
                                {
                                    
int heighty = e.CellBounds.Height / 2 * rowcount;
                                    e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
                                        Brushes.Crimson, e.CellBounds.X 
+ 2,
                                        e.CellBounds.Y 
+ 2 - heighty, StringFormat.GenericDefault);
                                    rowcount 
= 0;
                                }
                            }
                            
else
                            {
                                rowcount
++;
                            }
                        }
                        
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;
                    }
                }
            }

            
#region//横向合并
            
//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;
            
//        }
            
//    }

            
//}
            #endregion

        }

        
#endregion




        
private void Form1_Load(object sender, EventArgs e)
        {
            DataTable dt 
= new DataTable();
            dt.Columns.Add(
"description");
            dt.Columns.Add(
"name");
            dt.Columns.Add(
"sex");

            dt.Rows.Add(
"A""cc""1");
            dt.Rows.Add(
"A""dd""1");
            dt.Rows.Add(
"B""dd""0");
            dt.Rows.Add(
"A""dd""0");
            dt.Rows.Add(
"C""dd""0");
            dt.Rows.Add(
"A""dd""0");
            dt.Rows.Add(
"C""dd""0");

            
// 不允许调整行高 用于合并行居中
            this.dataGridView1.AllowUserToResizeRows = false;
            
this.dataGridView1.DataSource = dt;
            
this.dataGridView1.Sort(this.dataGridView1.Columns["description"],ListSortDirection.Ascending);
            
            
//  按和并列,排序
            
//  dataGridView1.Columns["Column1"].HeaderCell.SortGlyphDirection = SortOrder.Ascending
            
//  this.dataGridView1.Sort(this.dataGridView1.Columns["description"], ListSortDirection.Ascending);
            bool issort = false;

            //暂时只想到这个办法
            
this.dataGridView1.Sorted += new EventHandler((xx, yy) =>
            {
                
//this.dataGridView1.SortedColumn.SortMode = DataGridViewColumnSortMode.Automatic;
                
//this.dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;
                
                
string col = this.dataGridView1.SortedColumn.Name;
                
if (col == "description"||col=="")
                {
                    col 
= "";
                }
                
else 
                {
                    col 
= "," + col;
                }
                
// 重新指定排序规则
                
// 在第一列默认排列顺序下,排列其他列
                DataView dv = dt.DefaultView;
                
if (issort)
                {
                    dv.Sort 
= "description  "+col+" ASC";
                    issort 
= !issort;
                }
                
else
                {
                    dv.Sort 
= "description  " + col + " DESC";
                    issort 
= !issort;
                }

                
this.dataGridView1.DataSource = dv;
              
//  this.dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Automatic;
               
            });



        }

   




    }
}

 

1. Convert.ToString(this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value))

  原文直接.tostring().   当datagridview 启动添加行时,比较最后一行时会有错误.

2.不足:当选中单元格,或调整行高或其他操作,合并列的值会显示.

2. 只为简单记录随笔,别无它意.

代码:/Files/dayou123123/合并DataGridView.rar

原文:http://blog.csdn.net/csharp_start/archive/2007/09/30/1808000.aspx

更多:http://www.cnblogs.com/peterzb/archive/2009/05/29/1491891.html

posted @ 2011-06-11 17:49  Vinton.Liu  阅读(4036)  评论(0编辑  收藏  举报