• 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(15224);
                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(247246239);
                
    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(216229248);
                
    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(614);
                
    #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(15224);
                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
        }
    }
    本人的博客不再维护从2013年就不再维护了 需要我帮助的朋友请到我的个人论坛 http://www.sufeinet.com 进行讨论,感谢大家对我的支持!
  • 相关阅读:
    .NET Core 服务调用 RPC
    从Docker 到 Kubernatetes 的跃迁之路
    同步异步-多线程梳理
    Net的微服务选型之路
    Visual Studio 2019安装SSIS
    HL7协议的基本语法
    vue学习笔记
    开发常用的部分sql语句总结
    VSPD虚拟串口来调试通信接口程序
    SSRS报表工具之合并行数据
  • 原文地址:https://www.cnblogs.com/sufei/p/2078286.html
Copyright © 2020-2023  润新知