`

DataGridView历史记录的前进与后退操作

    博客分类:
  • C#
 
阅读更多
此功能介绍:DataGridView频繁查询数据时,可以将每次查询到的数据结果保存到.xml文件中。并给用户提供前进、后退按钮操作.当用户想查看上一次的查询结果时,可直接从保存到的.xml文件中加载数据,提高查询速度。


        /// <summary>
        /// DataGridView所在窗体功能前进与后退
        ///文件格式: File$001.xml File$002.xml 
        ///当前文件: File$003Cur.xml 
        ///使用方法:
        /// 定义全局窗体级变量(以便各模块调用)
        /// HR.Controls.DataGridViewOperation.FunctionForwardBack FFB = new HR.Controls.DataGridViewOperation.FunctionForwardBack();
        /// 
        /// 在窗体启动时执行(以便删除上次未删除的临时保存文件)
        /// FFB.DeleteXmlFile(功能模块ID);
        /// 
        /// 当数据源DataSource改变时
        /// FFB.SaveXmlFile(功能模块ID, DataGridView控件名, 前进控件, 后退控件);
        /// 
        /// 在窗体退出时执行(以便删除临时保存文件)
        /// BC.XmlFileDelete(功能模块ID)
        /// 
        /// 在点击“前进”时执行
        /// FFB.DataGridViewSetData(功能模块ID, DataGridView控件名, HR.Controls.DataGridViewOperation.FunctionForwardBack.ForwardBackOption.Forward, 前进控件, 后退控件);
        /// 
        /// 在点击“后退”时执行
        /// FFB.DataGridViewSetData(功能模块ID, DataGridView控件名, HR.Controls.DataGridViewOperation.FunctionForwardBack.ForwardBackOption.Back, 前进控件, 后退控件);
        /// </summary>
        public class FunctionForwardBack
        {
            #region DataGridView历史数据的前进、后退操作
            /// <summary>
            /// 前进后退操作
            /// </summary>
            /// <remarks></remarks>
            public enum ForwardBackward
            {
                /// <summary>
                /// 前进
                /// </summary>
                Forward,
                /// <summary>
                /// 后退
                /// </summary>
                Backward,
            }

            /// <summary>
            ///  DataGridView控件前进或后退
            /// </summary>
            /// <param name="FormID">功能编号</param>
            /// <param name="Dg">DataGridView控件</param>
            /// <param name="ForwardBack">前进或后退</param>
            /// <param name="ForwardControl">前进控件</param>
            /// <param name="BackwardControl">后退控件</param>
            /// <returns></returns>
            public bool SetDataGridViewData(string FormID, DataGridView Dg, ForwardBackward ForwardBack, object ForwardControl, object BackwardControl)
            {
                string CurDir = System.Windows.Forms.Application.StartupPath + "\\TempFile\\" + FormID + "\\";
                if (!Directory.Exists(CurDir))
                    return false;
                if (this.GetFilesInCurrentDir(CurDir,"*.xml").Count<=0) //要查找的文件不存在
                {
                    return false;
                }

                DataSet ds = new DataSet();
                try
                {
                    ds.ReadXml(RestoreAllFile(FormID, ForwardBack, ForwardControl, BackwardControl));
                    Dg.DataSource = null;
                    if (ds.Tables.Count>0)
                    {
                        Dg.DataSource = ds.Tables[0];
                    }
                    SetContrl(FormID, ForwardControl, BackwardControl);//数据绑定完后,重新设置一下前进、后退按钮
                    return true;
                }
                catch 
                {
                    SetContrl(FormID, ForwardControl, BackwardControl);
                    return false;
                }


                return true;
            }



            /// <summary>
            /// 将文件名全部重置,并返回当前文件
            /// </summary>
            /// <param name="FormID">功能编号</param>
            /// <param name="ForwardBack">前进或后退</param>
            /// <param name="ForwardControl">前进控件</param>
            /// <param name="BackwardControl">后退控件</param>
            /// <returns>当前文件</returns>
            private string RestoreAllFile(string FormID, ForwardBackward ForwardBack, object ForwardControl, object BackwardControl)
            {
                int CurrentIndex = RestoreFileName(FormID, ForwardBack, ForwardControl, BackwardControl);
                if (CurrentIndex == 9999)
                    return null;

                string CurDir = System.Windows.Forms.Application.StartupPath + "\\TempFile\\" + FormID + "\\";
                ArrayList FileArry = this.GetFilesInCurrentDir(CurDir, "*.xml");

                string SourceFile = string.Empty;
                string DestFile = string.Empty;
                switch (ForwardBack)
                {
                    case ForwardBackward.Forward: //如果是前进
                        CurrentIndex++; //前当文件的索引加1
                        SourceFile =CurDir + FileArry[CurrentIndex].ToString();

                        if (File.Exists(SourceFile))
                        {
                            DestFile=FileArry[CurrentIndex].ToString().Replace("File$","").Substring(0,3).Trim();
                            DestFile =CurDir + "File$" + DestFile.PadLeft(3,'0') + "Cur" + ".xml";
                            File.Copy(SourceFile, DestFile, true);
                            System.Windows.Forms.Application.DoEvents();
                            File.Delete(SourceFile);

                        }
                        break;
                    case ForwardBackward.Backward://如果是后退
                        CurrentIndex--;
                        SourceFile = CurDir + FileArry[CurrentIndex].ToString();
                        if (File.Exists(SourceFile))
                        {
                            DestFile = FileArry[CurrentIndex].ToString().Replace("File$", "").Substring(0, 3).Trim();
                            DestFile = CurDir + "File$" + DestFile.PadLeft(3, '0') + "Cur" + ".xml";
                            File.Copy(SourceFile, DestFile, true);
                            System.Windows.Forms.Application.DoEvents();
                            File.Delete(SourceFile);
                        }
                        break;
                }
                return DestFile;


            }


            /// <summary>
            /// 将文件名全部重置,并返回当前文件索引
            /// </summary>
            /// <param name="FormID">功能编号</param>
            /// <param name="ForwardBack">前进或后退</param>
            /// <param name="ForwardControl">前进控件</param>
            /// <param name="BackwardControl">后退控件</param>
            /// <returns>当前文件索引</returns>
            private int RestoreFileName(string FormID, ForwardBackward ForwardBack, object ForwardControl, object BackwardControl)
            {
                string CurDir = System.Windows.Forms.Application.StartupPath + "\\TempFile\\" + FormID + "\\";
                ArrayList FileArry=this.GetFilesInCurrentDir(CurDir,"*.xml");
                int CurrIndex = FileArry.Count - 1; //文件索引数


                string SourceFile = string.Empty;
                string DestFile = string.Empty;
                for (int i = 0; i < FileArry.Count; i++)
                {
                    if (FileArry[i].ToString().Length > 12)   //文件列表中有File$xxxCur.xml的文件存在
                    {
                        if (i==0 && ForwardBack==ForwardBackward.Backward)
                        {
                   
                            return 9999;
                        }

                        if(i==FileArry.Count-1 && ForwardBack==ForwardBackward.Forward)
                        {
                            return 9999;
                        }

                        try
                        {
                            CurrIndex = i;
                            SourceFile = CurDir + FileArry[i].ToString();
                            DestFile = FileArry[i].ToString().Replace("File$", "").Substring(0, 3).Trim();
                            DestFile = CurDir + "File$" + DestFile.PadLeft(3, '0') + ".xml";
                            File.Copy(SourceFile, DestFile);
                            System.Windows.Forms.Application.DoEvents();
                            File.Delete(SourceFile);
                        }
                        catch
                        {
                            return 9999;
                        }
                    }
                }

                  return CurrIndex;
              }

            #endregion


            #region DataGridView 每次查询时后将结果保存为xml文件
            /// <summary>
            /// 保存数据结果到Xml文件,在数据结果变化前
            /// </summary>
            /// <param name="FormID">功能编号</param>
            /// <param name="DG">要保存的DataGridView控件</param>
            /// <param name="ForwardControl">前进控件</param>
            /// <param name="BackControl">后退控件</param>
            /// <returns></returns>
            public bool SaveXmlFile(string FormID, DataGridView DG, object ForwardControl, object BackControl)
            {
                if (DG.DataSource == null)
                    return false;

                string CurDir = System.Windows.Forms.Application.StartupPath + "\\TempFile\\" + FormID + "\\";
                DirectoryInfo TempDir = new DirectoryInfo(CurDir);
                int MaxID = 1;
                if (!TempDir.Exists)
                    TempDir.Create();
                else
                    MaxID = RenFileAll(FormID);
                string NewFileName = "File$" + MaxID.ToString().PadLeft(3, '0') + ".xml";
                System.Data.DataTable dt = (System.Data.DataTable)DG.DataSource;
                dt.TableName = "HR";
                dt.WriteXml(CurDir+NewFileName, XmlWriteMode.WriteSchema);
                System.Windows.Forms.Application.DoEvents();
                GC.Collect();
                SetContrl(FormID, ForwardControl, BackControl);
                return true;

            }

            /// <summary>
            /// 重置文件列表序列
            /// </summary>
            /// <param name="FormID">功能编号</param>
            /// <returns></returns>
            private int RenFileAll(string FormID)
            {
                string CurDir = System.Windows.Forms.Application.StartupPath + "\\TempFile\\" + FormID + "\\";
                ArrayList fileArry = null;
                fileArry = GetFilesInCurrentDir(CurDir, "*.xml");
                int i=0;
                int CurIndex = 0;
                bool isDelFile=false;
                for (i =0;  i< fileArry.Count; i++)
                {
                    if (fileArry[i].ToString().Length>12) //文件是File$00xCur.xml形式的
                    {
                        isDelFile = true;
                        CurIndex = i + 1;
                    }
                }

                if (isDelFile)  //删除[File$00xCur.xml]这个文件后面的所有文件
                {
                    for ( i=CurIndex ; i < fileArry.Count; i++)
                    {
                        string SourFile = fileArry[i].ToString();
                        try
                        {
                            if (File.Exists(SourFile))
                                File.Delete(SourFile);
                        }
                        catch
                        {
                           
                        }
                    }
                }

                fileArry.Clear();
                fileArry = GetFilesInCurrentDir(CurDir, "*.xml");

                for (i = 0; i < fileArry.Count; i++)
                {
                    if (fileArry[i].ToString().Length>12)
                    {
                        string SourFile = null;
                        string DestFile = null;

                        SourFile = CurDir + fileArry[i].ToString();
                        if (File.Exists(SourFile))
                        {
                            DestFile = int.Parse(fileArry[i].ToString().Replace("File$", "").Substring(0, 3)).ToString().Trim();
                            DestFile = CurDir + "File$" + DestFile.PadLeft(3, '0') + ".xml";
                            File.Copy(SourFile, DestFile);
                            File.Delete(SourFile);

                        }

                    }
                }
               return  fileArry.Count + 1;

            }

            #endregion


            #region "查找文件在当前目录,不包括子目录"
            /// <summary>
            /// 查找文件在当前目录,不包括子目录
            /// </summary>
            /// <param name="DirPath">要查找的文件夹.</param>
            /// <param name="FileExtName">文件扩展名</param>
            /// <returns></returns>
            private ArrayList GetFilesInCurrentDir(string DirPath, string FileExtName)
            {
                System.Collections.ArrayList FileArry = new ArrayList();
                if (!string.IsNullOrEmpty(DirPath))
                {
                    DirectoryInfo RootDir = new DirectoryInfo(DirPath);
                    if (RootDir.Exists)
                    {
                        try
                        {
                            foreach (FileInfo file in RootDir.GetFiles(FileExtName))
                            {
                                FileArry.Add(file.Name);
                            }
                        }
                        catch
                        {

                        }
                    }
              
                }
            

               // FileArry.Sort();
                return FileArry;
            }
            #endregion
            
            
            #region  前进、后退按钮的控制

            /// <summary>
            /// 设置前进、后退控制的可用或不可用
            /// </summary>
            /// <param name="FormID"></param>
            /// <param name="ForewardContrl"></param>
            /// <param name="BackwardContrl"></param>
            private void SetContrl(string FormID, object ForewardContrl, object BackwardContrl)
            {
                System.Windows.Forms.Application.DoEvents();
                System.Windows.Forms.Application.DoEvents();
                System.Windows.Forms.Application.DoEvents();
                SetControlEnable(true, true, ForewardContrl, BackwardContrl);

                string CurDir = System.Windows.Forms.Application.StartupPath + "\\TempFile\\" + FormID + "\\";
                DirectoryInfo TempDir = new DirectoryInfo(CurDir);
                if (!TempDir.Exists)
                {
                    SetControlEnable(false, false,ForewardContrl,BackwardContrl);
                    return;
                }

                ArrayList  FileList = this.GetFilesInCurrentDir(CurDir, "*.xml");
                if (FileList.Count < 2)
                {
                    SetControlEnable(false, false, ForewardContrl, BackwardContrl);
                }
                else
                {
                    for (int i = 0; i < FileList.Count; i++)
                    {
                        if (FileList[i].ToString().Length>12)
                        {
                            if (i == 0)
                                SetControlEnable(true, false,ForewardContrl,BackwardContrl);
                            if (i == FileList.Count - 1)
                                SetControlEnable(false, true, ForewardContrl, BackwardContrl);
                        }
                    }
                }

                return;
            }


            /// <summary>
            /// 设置前后、后退按钮的可用状态
            /// </summary>
            /// <param name="isForewardContrl">if set to <c>true</c> [is foreward contrl].</param>
            /// <param name="isBackwardContrl">if set to <c>true</c> [is backward contrl].</param>
            /// <param name="ForewardContrl">The foreward contrl.</param>
            /// <param name="BackwardContrl">The backward contrl.</param>
            /// <remarks>前后、后退按钮分三种类型[System.Windows.Forms.ToolStripButton],[System.Windows.Forms.Button],[System.Windows.Forms.toolStripMenuItem]</remarks>
            private void SetControlEnable(bool isForewardContrl, bool isBackwardContrl, object ForewardContrl, object BackwardContrl)
            {
                if (ForewardContrl != null)
                {
                    if (ForewardContrl.GetType().ToString() == "System.Windows.Forms.ToolStripButton")
                    {
                        ((ToolStripButton)ForewardContrl).Enabled = isForewardContrl;
                    }
                    else if (ForewardContrl.GetType().ToString() == "System.Windows.Forms.Button")
                    {
                        ((System.Windows.Forms.Button)ForewardContrl).Enabled = isForewardContrl;
                    }
                    else if (ForewardContrl.GetType().ToString() == "System.Windows.Forms.ToolStripMenuItem")
                    {
                        ((System.Windows.Forms.ToolStripMenuItem)ForewardContrl).Enabled = isForewardContrl;
                    }
                }
                if (BackwardContrl != null)
                {
                    if (BackwardContrl.GetType().ToString() == "System.Windows.Forms.ToolStripButton")
                    {
                        ((System.Windows.Forms.ToolStripButton)BackwardContrl).Enabled = isBackwardContrl;
                    }
                    else if (BackwardContrl.GetType().ToString() == "System.Windows.Forms.Button")
                    {
                        ((System.Windows.Forms.Button)BackwardContrl).Enabled = isBackwardContrl;
                    }
                    else if (BackwardContrl.GetType().ToString() == "System.Windows.Forms.ToolStripMenuItem")
                    {
                        ((System.Windows.Forms.ToolStripMenuItem)BackwardContrl).Enabled = isBackwardContrl;
                    }
                }

            }
            #endregion


            /// <summary>
            /// 窗体关闭或启动时需要删除文件
            /// </summary>
            /// <param name="FormID">窗体ID编号</param>
            /// <returns></returns>
            public bool DeleteXmlFile(string FormID)
            {
                bool issuccess = true;
                string CurDir = System.Windows.Forms.Application.StartupPath + "\\TempFile\\" + FormID + "\\";
                if (!Directory.Exists(CurDir))
                   return issuccess= false;
                ArrayList FileArry = this.GetFilesInCurrentDir(CurDir, "*.xml");
                if (FileArry.Count > 1)
                {
                    for (int i = 0; i < FileArry.Count; i++)
                    {
                        try
                        {
                            File.Delete(CurDir + FileArry[i].ToString());
                            issuccess= true;
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                            issuccess= false;
                        }
                    }
                }
                return issuccess;
            }
        }
分享到:
评论

相关推荐

    基于C#的WinForm中DataGridView控件操作汇总

    "基于C#的WinForm中DataGridView控件操作汇总" 在C#的WinForm中,DataGridView控件是一种常见的控件,用于显示和编辑表格数据。下面将对DataGridView控件的操作进行汇总。 一、单元格内容的操作 在DataGridView...

    c# 中datagridView中删除行的经典操作

    ### C# 中 DataGridView 删除行的经典操作详解 在C# 的 Windows Forms 应用程序开发中,`DataGridView` 控件是处理表格数据时非常常用的一个组件。它提供了丰富的功能来显示、编辑、添加或删除数据。本文将详细介绍...

    DataGridView的各种操作方法

    在Windows Forms开发中,`DataGridView`控件是一个非常重要的组件,用于展示和操作表格数据。在本文中,我们将深入探讨`DataGridView`的各种操作方法及其功能实现,特别是如何格式化显示数据。 首先,让我们关注`...

    DataGridView 实现一列单元格 显示多操作方式

    本教程将深入探讨如何在`DataGridView`的一列单元格中实现多种操作方式。 首先,我们需要创建一个`DataGridView`实例并添加到窗体上。这通常在`Form1.Designer.cs`文件中完成,通过`Controls.Add(dataGridView1)`...

    asp.net 通讯录 连接数据库 dataGridView数据的显示 dataGridView定位 dataGridView修改 删除

    在ASP.NET开发中,数据管理是一个关键环节,而与数据库的交互、数据显示以及用户操作处理是其中的核心部分。本文将详细讲解如何利用ASP.NET实现通讯录应用,包括连接数据库、在dataGridView控件中显示数据、实现...

    DataGridView控件的操作

    本篇文章将深入探讨如何在`DataGridView`中直接操作数据,以及与数据库的连接。 一、`DataGridView`控件的基本操作 1. 添加`DataGridView`控件:首先,你需要在Windows Forms设计器中从工具箱拖放`DataGridView`...

    c# datagridView 经典操作 完全版

    在本篇文章中,我们将探讨几个关于`dataGridView`的经典操作,包括如何填充数据、获取和修改单元格内容、设定单元格只读以及如何在行间导航。 首先,填充`dataGridView`的数据通常涉及数据库操作。以下是一个简单的...

    dataGridView

    例如,你可以创建一个窗体,将dataGridView与数据库表绑定,允许用户浏览记录、添加新记录、更新现有记录和删除记录。通过处理dataGridView的各种事件,可以实现数据验证、错误提示等功能。 总的来说,dataGridView...

    操作DataGridView控件详解

    ### 操作DataGridView控件详解 #### 一、DataGridView控件简介 `DataGridView` 控件是.NET框架中的一个重要组件,主要用于Windows应用程序中展示和编辑数据。它具有高度的灵活性和丰富的特性,可以支持多种数据源,...

    dataGridView右鍵操作C#

    接下来,我们需要将`dataGridView`与`ContextMenuStrip`关联起来,这可以通过设置`DataGridView.ContextMenuStrip`属性实现: ```csharp dataGridView1.ContextMenuStrip = contextMenuStrip1; ``` 当用户在...

    DataGridView实现无限制撤销恢复

    在我们的场景中,我们将利用这个模式来记录`DataGridView`在每次修改后的状态,以便于之后执行撤销或恢复操作。 首先,我们需要创建一个备忘录类,它将存储`DataGridView`的当前状态。这个类可能包含以下信息: 1....

    DataGridView操作技巧.doc

    ### DataGridView操作技巧详解 #### 一、DataGridView基本属性设置 在使用DataGridView时,根据实际应用场景的不同,我们需要对一些关键属性进行设置。以下是一些常用的属性及其推荐设置: 1. **...

    C# Winform中DataGridView的操作

    ### C# Winform中DataGridView的操作 #### 概述 DataGridView 控件是Windows Forms应用程序中用于显示数据的强大工具。它能够方便地展示二维表格形式的数据,并提供了丰富的功能,如排序、筛选、编辑等。本文将...

    C#DataGridView操作

    C# DataGridView 操作 作为 WinForm 开发中最常用的控件之一,DataGridView 控件提供了丰富的操作接口用于处理数据展示和编辑。下面将总结 DataGridView 控件的各种操作,包括单元格内容的操作、属性设置等。 一、...

    用DataGridView显示和操作数据库

    ### 使用DataGridView显示与操作数据库 在.NET框架下开发Windows Forms应用程序时,经常需要用到DataGridView控件来展示和操作数据库中的数据。DataGridView控件提供了强大的数据绑定功能,并且支持各种数据源,如...

    DataGridView控件的各种操作总结

    本篇文章将详细探讨DataGridView控件的一些核心操作,包括单元格操作、属性设置、遍历以及设置单元格的只读状态。 首先,我们关注单元格操作。要获取当前活动单元格的内容、列索引和行索引,可以使用以下代码: ``...

    C# datagridview复制粘贴删除等操作

    在.NET框架中,C#的DataGridView控件是一个强大的数据展示工具,它允许用户与数据进行交互,如查看、编辑、添加、删除等操作。在实际的项目开发中,经常需要实现复制、粘贴和删除等功能,以提升用户体验。本文将详细...

    VB.NET:winForm扩展DataGridView控件实现一列多操作(如查看详情、修改、删除等)按钮

    winForm扩展DataGridView控件实现一列多操作(如查看详情、修改、删除等)按钮,使用VB.NET语言通过扩展DataGridViewButtonCell单元格,在单元格内画按钮的方式来实现。具体效果请看我的博文...

    c#DataGridView的基本操作,

    C# DataGridView 的基本操作详解 C# DataGridView 是一个强大的控件,能够用来显示和编辑数据。通过 DataGridView,我们可以实现多种操作,例如取得或者修改当前单元格的内容、设定单元格只读、不显示最下面的新行...

    vb.net DataGridView控件用法合集

    vb.net操作DataGridView控件的用法的集合,包括: 1. DataGridView当前的单元格属性取得、变更 2. DataGridView编辑属性 3. DataGridView最下面一列新追加行非表示 4. DataGridView判断当前选中行是否为新追加的...

Global site tag (gtag.js) - Google Analytics