DataGridView分级显示

     DataGridView的分级显示,如果想找相关的第三方控件的时候,可以在codeproject中输入datagridview outlook,有个控件,看上去还是很不错的。下面的代码只是简单的实现了这个效果,感觉没必要重写控件。

      有图有真相,先看看效果图吧。

     

      好了,这个功能一看就知道了,下面给出完成的代码(数据源的绑定就省略了,思路明白就OK,呵呵)

代码
        #region  绘制单元格
        
private   void  dgvAlarmLog_RowPostPaint( object  sender, DataGridViewRowPostPaintEventArgs e)
        {
            
if  (e.RowIndex  >=   0 )
            {
                Graphics g 
=  e.Graphics;
                
if  (dgvAlarmLog.Rows[e.RowIndex].Cells[ 0 ].Value  ==  plusImage  ||  dgvAlarmLog.Rows[e.RowIndex].Cells[ 0 ].Value  ==  subImage)
                {
                    
using  (Brush gridBrush  =   new  SolidBrush( this .dgvAlarmLog.GridColor), backColorBrush  =   new  SolidBrush(Color.White), fontBrush  =   new  SolidBrush(System.Drawing.Color.Black))
                    {
                        
// 去线
                        Rectangle rect  =  e.RowBounds;
                        g.FillRectangle(backColorBrush, rect.X 
+   30 , rect.Y, dgvAlarmLog.Width, rect.Height  -   1 );
                        
// 定义字体
                        Font font  =   new  Font( " 宋体 " 10 , FontStyle.Bold);
                        
string  str  =  dgvAlarmLog.Rows[e.RowIndex].Cells[ 3 ].Value.ToString();

                        
// 显示日期
                        g.DrawString(str, font, fontBrush, rect.X  +   50 , rect.Y  +   4 );
                    }
                }
            }
        }
        
#endregion

        
#region  显示子数据
        
private   void  dgvAlarmLog_CellContentClick( object  sender, DataGridViewCellEventArgs e)
        {
            
// 单击图片
             if  (e.ColumnIndex  ==   0   &&  e.RowIndex >= 0 )
            {
                
object  imageValue  =  dgvAlarmLog.Rows[e.RowIndex].Cells[ 0 ].Value;
                
if  (imageValue  ==  plusImage)  // 展开
                {
                    
string [] strs  =  (dgvAlarmLog.Rows[e.RowIndex].Cells[ 4 ].Value.ToString()).Split( ' ' );
                    
string  sdate  =  strs[ 0 ].Trim();  // 开始时间
                     string  edate  =  strs[ 1 ].Trim();  // 结束时间

                    dgvAlarmLog.Rows[e.RowIndex].Cells[
0 ].Value  =  subImage;

                    DataRow[] drs 
=  dt.Select( " happen_date>=' "   +  sdate  +   " ' and happen_date <=' "   +  edate  +   " ' " );
                    
int  count  =   0 ;
                    
foreach  (DataRow dr  in  drs)
                    {
                        dgvAlarmLog.Rows.Insert(e.RowIndex 
+   1   +  (count ++ ),  new   object [] { blankImage, dr[ " describe " ].ToString(), dr[ " serial_no " ].ToString(), dr[ " happen_date " ].ToString(), dr[ " value " ].ToString(), dr[ " pre_value " ].ToString(), dr[ " avg_value " ].ToString() });
                    }
                }
                
else   if (imageValue  ==  subImage) // 折叠
                {
                    dgvAlarmLog.Rows[e.RowIndex].Cells[
0 ].Value  =  plusImage;
                    
try
                    {
                        
object  tempImage  =  dgvAlarmLog.Rows[e.RowIndex  +   1 ].Cells[ 0 ].Value;
                        
while  (tempImage  !=  plusImage  &&  tempImage  !=  subImage)
                        {
                            dgvAlarmLog.Rows.RemoveAt(e.RowIndex 
+   1 );
                            tempImage 
=  dgvAlarmLog.Rows[e.RowIndex  +   1 ].Cells[ 0 ].Value;
                        }
                    }
                    
catch  { }
                }
            }
        }
        
#endregion

     再看一个二级目录的效果图:

           

源代码下载地址:http://files.cnblogs.com/wangyong/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9.rar

转载于:https://www.cnblogs.com/wangyong/archive/2010/08/17/1801365.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值