C#仿QQ皮肤-DataGridView 最新1.2版

阅读全文:http://www.sufeinet.com/thread-598-1-1.html

 

先来看看效果吧

 
 
升级报告说明

   这次升级的功能主有
   1.对鼠标跟随效果进行的优化
   2.增加了行号的功能方便查找数据
   3.增加一个菜单功能,目前里面有的功能主要是冻结和恢复首行和首列功能。还有导出Excel和全选功能。
 

实现说明


   首先我们要准备两张图片,用来做什么呢,自然是用来做菜单使用的。我是临时整理了两张看着不怎么好看,不过功能不影响大家下载源代码后要吧自行修改的漂亮一些。

 

   然后我们第一步要做的是怎么样把这个图片添加到DataGridView里面去。在添加这个控件 之前呢我们要做两件事情,第一就是New一个左键菜单,绑定到这个菜单Button,

第二步是给这个button注册一个单击事件看下面的代码。

 

     #region  注册菜单项

            
// 在这里添加菜单项
            cmsleft.Items.Add(createItem( " clumnsFist " " 冻结首列 " new  EventHandler(clumnsFist_Click)));
            cmsleft.Items.Add(createItem(
" rowsFist " " 冻结首行 " new  EventHandler(rowsFistFist_Click)));
            cmsleft.Items.Add(createItem(
" officeExeceout " " 导出到Excel " new  EventHandler(officeExeceout_Click)));
            cmsleft.Items.Add(createItem(
" fullSelect " " 全选 " new  EventHandler(fullSelect_Click)));
            
#endregion

            
#region  绑定菜单

            Button objpb 
=   new  Button();
            objpb.BackgroundImage 
=  bxyztSkin.Properties.Resources.caidan;
            objpb.Location 
=   new  Point(objpb.Location.X  +   9 , objpb.Location.Y  +   4 );
            objpb.Width 
=   17 ;
            objpb.Text 
=   "" ;
            
// 绑定一个右键菜单
            objpb.ContextMenuStrip  =  cmsleft;
            objpb.Cursor 
=  System.Windows.Forms.Cursors.Hand;
            objpb.Height 
=   17 ;
            objpb.BackgroundImageLayout 
=  ImageLayout.Stretch;
            objpb.FlatStyle 
=  FlatStyle.Popup;
            
// 在添加前先注册一个事件
            objpb.Click  +=   new  EventHandler(objpb_Click);
            
this .Controls.Add(objpb);

            
#endregion

 

 这样的话我们在运行这个控件时就可以看到菜单效果了,下面我们来分别对事件进行一下处理吧

1.Button单击事件

         // Button单击事件
         void  objpb_Click( object  sender, EventArgs e)
        {
            Button objbootn 
=  (Button)sender;
            
// 显示菜单的位置
            objbootn.ContextMenuStrip.Show(Control.MousePosition.X, Control.MousePosition.Y);
        }

2.全选事件

    // 全选
         void  fullSelect_Click( object  sender, EventArgs e)
        {
            
this .SelectAll();
        }

3.导出到Excel事件

         // 导出到Excel
         void  officeExeceout_Click( object  sender, EventArgs e)
        {
            
if  ( this .Rows.Count  >   0 )
            {
                OfficeManagerMentServices.DataGridViewToExcel(
this );
            }
        }

OfficeManagerMentServices类如下

View Code
using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Windows.Forms;
using  System.IO;

namespace  bxyztSkin.csList
{
   
public    class  OfficeManagerMentServices
    {
        
///   <summary>    
        
///  将 DataGridView的数据导出Excel
        
///   </summary>    
        
///   <remarks>    
        
///  using System.IO;   
        
///   </remarks>    
        
///   <param name="dgv"></param>    
         public   static   void  DataGridViewToExcel(bxyztSkin.Editors.CDataGridView dgv)
        {

            SaveFileDialog dlg 
=   new  SaveFileDialog();
            dlg.Filter 
=   " Execl files (*.xls)|*.xls " ;
            dlg.CheckFileExists 
=   false ;
            dlg.CheckPathExists 
=   false ;
            dlg.FilterIndex 
=   0 ;
            dlg.RestoreDirectory 
=   true ;
            dlg.CreatePrompt 
=   false ;
            dlg.Title 
=   " 保存为Excel文件 " ;
            dlg.FileName 
=  DateTime.Now.Ticks.ToString().Trim();

            
if  (dlg.ShowDialog()  ==  DialogResult.OK)
            {
                Stream myStream;
                myStream 
=  dlg.OpenFile();
                StreamWriter sw 
=   new  StreamWriter(myStream, System.Text.Encoding.GetEncoding( - 0 ));
                
string  columnTitle  =   "" ;
                
try
                {
                    
// 写入列标题   
                     for  ( int  i  =   0 ; i  <  dgv.ColumnCount; i ++ )
                    {
                        
if  (i  >   0 )
                        {
                            columnTitle 
+=   " \t " ;
                        }
                        columnTitle 
+=  dgv.Columns[i].HeaderText;
                    }
                    sw.WriteLine(columnTitle);

                    
// 写入列内容   
                     for  ( int  j  =   0 ; j  <  dgv.Rows.Count; j ++ )
                    {
                        
string  columnValue  =   "" ;
                        
for  ( int  k  =   0 ; k  <  dgv.Columns.Count; k ++ )
                        {
                            
if  (k  >   0 )
                            {
                                columnValue 
+=   " \t " ;
                            }
                            
if  (dgv.Rows[j].Cells[k].Value  ==   null )
                                columnValue 
+=   "" ;
                            
else
                                columnValue 
+=  dgv.Rows[j].Cells[k].Value.ToString().Trim();
                        }
                        sw.WriteLine(columnValue);
                    }
                    sw.Close();
                    myStream.Close();
                }
                
catch  (Exception e)
                {
                    MessageBox.Show(e.ToString());
                }
                
finally
                {
                    sw.Close();
                    myStream.Close();
                }
            }
        }
    }
}

4.冻结/恢复首列

 

// 冻结/恢复首列
         void  clumnsFist_Click( object  sender, EventArgs e)
        {
            
if  ( this .Columns.Count  >=   1 )
            {
                
for  ( int  i  =   0 ; i  <   this .Columns.Count; i ++ )
                {
                    
if  ( this .Columns[i].Visible  ==   true )
                    {
                        
if  ( this .Columns[i].Frozen)
                        {
                            
this .Columns[i].Frozen  =   false ;
                            ((ToolStripMenuItem)sender).Text 
=   " 冻结首列 " ;
                            
return ;
                        }
                        
else
                        {
                            
this .Columns[i].Frozen  =   true ;
                            ((ToolStripMenuItem)sender).Text 
=   " 恢复首列 " ;
                            
return ;
                        }
                    }
                }
            }
        }

5.冻结/恢复首行

   // 冻结/恢复首行
         void  rowsFistFist_Click( object  sender, EventArgs e)
        {
            
if  ( this .Rows.Count  >=   1 )
            {
                
if  ( this .Rows[ 0 ].Frozen)
                {
                    
this .Rows[ 0 ].Frozen  =   false ;
                    ((ToolStripMenuItem)sender).Text 
=   " 冻结首行 " ;
                }
                
else
                {
                    
this .Rows[ 0 ].Frozen  =   true ;
                    ((ToolStripMenuItem)sender).Text 
=   " 解冻首行 " ;
                }
            }
        }

还有一个提供创建新的菜单项的方法

  ///   <summary>
        
///  创建新的菜单项
        
///   </summary>
        
///   <param name="name"> 菜单名 </param>
        
///   <param name="Text"> 显示文字 </param>
        
///   <param name="objEh"> 绑定事件 </param>
        
///   <returns> 返一个ToolStripMenuItem对象 </returns>
         private  ToolStripMenuItem createItem( string  name,  string  Text, EventHandler objEh)
        {
            System.Windows.Forms.ToolStripMenuItem lolumns 
=   new  System.Windows.Forms.ToolStripMenuItem();
            lolumns.ForeColor 
=  System.Drawing.Color.Black;
            lolumns.Name 
=  name;
            lolumns.Size 
=   new  System.Drawing.Size( 152 24 );
            lolumns.Text 
=  Text;
            lolumns.Click 
+=  objEh;
            
return  lolumns;
        }

 

我把全部代码放上大家多多指教

 

View Code
using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Diagnostics;
using  System.Text;
using  System.Drawing;
using  System.Windows.Forms;
using  bxyztSkin.csList;

namespace  bxyztSkin.Editors
{
    
public   partial   class  CDataGridView : System.Windows.Forms.DataGridView
    {
        
///   <summary>
        
///  类说明:CDataGridView控件的实现用来代替系统的DataGridView控件
        
///  编码日期:2011-03-02
        
///  编 码 人:  苏飞
        
///  联系方式:361983679  Email:sufei.1013@163.com  Blogs: http://sufei.cnblogs.com
        
///   </summary>
         public  CDataGridView()
        {
            
this .SetStyle(ControlStyles.DoubleBuffer  |  ControlStyles.AllPaintingInWmPaint,  true );
        }
        
// [Description("是否调用复制的开关,True为开启,False为不开启"), EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
        
// public Boolean clipboard { get; set; }


        
// [Description("复制的单元格号码从0开始"), EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
        
// public int clipboardnumber { get; set; }

        
// [Description("行号的颜色"), EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
        
// public Color RowIndexColor { get; set; }

        
protected   override   void  OnCreateControl()
        {
            
this .EnableHeadersVisualStyles  =   false ;
            
this .ColumnHeadersDefaultCellStyle.BackColor  =  Color.FromArgb( 247 246 239 );
            
this .ColumnHeadersBorderStyle  =  DataGridViewHeaderBorderStyle.Raised;
            
this .ColumnHeadersHeight  =   26 ;
            
this .ColumnHeadersHeightSizeMode  =  DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
            
this .ColumnHeadersDefaultCellStyle.Alignment  =  System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
            
this .ColumnHeadersDefaultCellStyle.ForeColor  =  System.Drawing.SystemColors.WindowText;
            
this .ColumnHeadersDefaultCellStyle.SelectionBackColor  =  System.Drawing.SystemColors.Highlight;
            
this .ColumnHeadersDefaultCellStyle.SelectionForeColor  =  System.Drawing.SystemColors.HighlightText;
            
this .RowHeadersDefaultCellStyle.Alignment  =  System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
            
this .RowHeadersDefaultCellStyle.BackColor  =  System.Drawing.SystemColors.Window;
            
this .RowHeadersDefaultCellStyle.ForeColor  =  System.Drawing.SystemColors.WindowText;
            
this .RowHeadersBorderStyle  =  System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
            
this .DefaultCellStyle.SelectionBackColor  =  Color.Wheat;
            
this .DefaultCellStyle.SelectionForeColor  =  Color.DarkSlateBlue;
            
this .RowHeadersWidthSizeMode  =  DataGridViewRowHeadersWidthSizeMode.DisableResizing;
            
this .GridColor  =  System.Drawing.SystemColors.GradientActiveCaption;
            
this .BackgroundColor  =  System.Drawing.SystemColors.Window;
            
this .BorderStyle  =  System.Windows.Forms.BorderStyle.Fixed3D;
            
this .AllowUserToOrderColumns  =   true ;
            
this .AutoGenerateColumns  =   true ;

            
// 奇数行的颜色
             this .AlternatingRowsDefaultCellStyle.BackColor  =  Color.FromArgb( 216 229 248 );
            
base .OnCreateControl();

            
#region  菜单体
            bxyztSkin.CControls.CContextMenuStrip cmsleft 
=   new  bxyztSkin.CControls.CContextMenuStrip();
            cmsleft.Font 
=   new  System.Drawing.Font( " 微软雅黑 " , 10F);
            cmsleft.Name 
=   " cmsleft " ;
            cmsleft.Size 
=   new  System.Drawing.Size( 61 4 );
            
#endregion

            
#region  注册菜单项

            
// 在这里添加菜单项
            cmsleft.Items.Add(createItem( " clumnsFist " " 冻结首列 " new  EventHandler(clumnsFist_Click)));
            cmsleft.Items.Add(createItem(
" rowsFist " " 冻结首行 " new  EventHandler(rowsFistFist_Click)));
            cmsleft.Items.Add(createItem(
" officeExeceout " " 导出到Excel " new  EventHandler(officeExeceout_Click)));
            cmsleft.Items.Add(createItem(
" fullSelect " " 全选 " new  EventHandler(fullSelect_Click)));
            
#endregion

            
#region  绑定菜单

            Button objpb 
=   new  Button();
            objpb.BackgroundImage 
=  bxyztSkin.Properties.Resources.caidan;
            objpb.Location 
=   new  Point(objpb.Location.X  +   9 , objpb.Location.Y  +   4 );
            objpb.Width 
=   17 ;
            objpb.Text 
=   "" ;
            
// 绑定一个右键菜单
            objpb.ContextMenuStrip  =  cmsleft;
            objpb.Cursor 
=  System.Windows.Forms.Cursors.Hand;
            objpb.Height 
=   17 ;
            objpb.BackgroundImageLayout 
=  ImageLayout.Stretch;
            objpb.FlatStyle 
=  FlatStyle.Popup;
            
// 在添加前先注册一个事件
            objpb.Click  +=   new  EventHandler(objpb_Click);
            
this .Controls.Add(objpb);

            
#endregion
        }

        
#region  菜单项的事件集合

        
// 全选
         void  fullSelect_Click( object  sender, EventArgs e)
        {
            
this .SelectAll();
        }

        
// 导出到Excel
         void  officeExeceout_Click( object  sender, EventArgs e)
        {
            
if  ( this .Rows.Count  >   0 )
            {
                OfficeManagerMentServices.DataGridViewToExcel(
this );
            }
        }

        
// 冻结/恢复首列
         void  clumnsFist_Click( object  sender, EventArgs e)
        {
            
if  ( this .Columns.Count  >=   1 )
            {
                
for  ( int  i  =   0 ; i  <   this .Columns.Count; i ++ )
                {
                    
if  ( this .Columns[i].Visible  ==   true )
                    {
                        
if  ( this .Columns[i].Frozen)
                        {
                            
this .Columns[i].Frozen  =   false ;
                            ((ToolStripMenuItem)sender).Text 
=   " 冻结首列 " ;
                            
return ;
                        }
                        
else
                        {
                            
this .Columns[i].Frozen  =   true ;
                            ((ToolStripMenuItem)sender).Text 
=   " 恢复首列 " ;
                            
return ;
                        }
                    }
                }
            }
        }

        
// 冻结/恢复首行
         void  rowsFistFist_Click( object  sender, EventArgs e)
        {
            
if  ( this .Rows.Count  >=   1 )
            {
                
if  ( this .Rows[ 0 ].Frozen)
                {
                    
this .Rows[ 0 ].Frozen  =   false ;
                    ((ToolStripMenuItem)sender).Text 
=   " 冻结首行 " ;
                }
                
else
                {
                    
this .Rows[ 0 ].Frozen  =   true ;
                    ((ToolStripMenuItem)sender).Text 
=   " 解冻首行 " ;
                }
            }
        }

        
#endregion

        
///   <summary>
        
///  创建新的菜单项
        
///   </summary>
        
///   <param name="name"> 菜单名 </param>
        
///   <param name="Text"> 显示文字 </param>
        
///   <param name="objEh"> 绑定事件 </param>
        
///   <returns> 返一个ToolStripMenuItem对象 </returns>
         private  ToolStripMenuItem createItem( string  name,  string  Text, EventHandler objEh)
        {
            System.Windows.Forms.ToolStripMenuItem lolumns 
=   new  System.Windows.Forms.ToolStripMenuItem();
            lolumns.ForeColor 
=  System.Drawing.Color.Black;
            lolumns.Name 
=  name;
            lolumns.Size 
=   new  System.Drawing.Size( 152 24 );
            lolumns.Text 
=  Text;
            lolumns.Click 
+=  objEh;
            
return  lolumns;
        }

        
// Button单击事件
         void  objpb_Click( object  sender, EventArgs e)
        {
            Button objbootn 
=  (Button)sender;
            
// 显示菜单的位置
            objbootn.ContextMenuStrip.Show(Control.MousePosition.X, Control.MousePosition.Y);
        }

        
#region  鼠标颜色
        Color defaultcolor;

        
// 移到单元格时的颜色
         protected   override   void  OnCellMouseMove(DataGridViewCellMouseEventArgs e)
        {
            
base .OnCellMouseMove(e);
            
try
            {
                Rows[e.RowIndex].DefaultCellStyle.BackColor 
=  Color.YellowGreen;
            }
            
catch  { }
        }

        
// 进入单元格时保存当前的颜色

        
protected   override   void  OnCellMouseEnter(DataGridViewCellEventArgs e)
        {
            
base .OnCellMouseEnter(e);
            
try
            {
                defaultcolor 
=  Rows[e.RowIndex].DefaultCellStyle.BackColor;
            }
            
catch  { }
        }

        
// 离开时还原颜色
         protected   override   void  OnCellMouseLeave(DataGridViewCellEventArgs e)
        {
            
base .OnCellMouseLeave(e);
            
try
            {
                Rows[e.RowIndex].DefaultCellStyle.BackColor 
=  defaultcolor;
            }
            
catch  { }
        }

        
// 在生成列表时添加一个行号,颜色默认为红色
         protected   override   void  OnRowPostPaint(DataGridViewRowPostPaintEventArgs e)
        {
            
base .OnRowPostPaint(e);
            
// 自动编号与数据库无关
            Rectangle rectangle  =   new  Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, RowHeadersWidth  -   4 , e.RowBounds.Height);
            TextRenderer.DrawText(e.Graphics, (e.RowIndex 
+   1 ).ToString(), RowHeadersDefaultCellStyle.Font, rectangle,
             Color.Red, TextFormatFlags.VerticalCenter 
|  TextFormatFlags.HorizontalCenter);
        }

        
#endregion
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值