C#编程学习18:使用多文档窗体框架利用DataGridView对Access数据表进行增删改及导出excel操作

简介: C#编程学习18:使用多文档窗体框架利用DataGridView对Access数据表进行增删改及导出excel操作

1 控件准备

创建winform窗体,并将其IsMdiContainer属性设置为true

1.1 Mdi窗体空间及设置

(1)RibbonControl控件

Navigation & Layout下添加RibbonControl控件2019052020374842.png

(2)按钮添加

添加按钮barbtn_database,Caption = “数据库处理”;


1.2 数据库处理子窗体

添加名称为dataBase的窗体

添加dataGridView控件,属性设置如下:


image.png


添加panel控件,设置Anchor属性为Top, Bottom, Left, Right

在panel控件上拖拽四个button控件,


image.png


2 实现代码

2.1 名称空间引用


添加名称空间引用:using System.Data.OleDb; //连接Access数据库使用


添加名称空间引用:using System.Threading; //导出到excel使用


添加名称空间引用:using Excel = Microsoft.Office.Interop.Excel;


201905202129443.png


2.2 全局变量定义

数据库链接字符串全局变量:


 string connectStr= @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=你的数据库mdb文件路径\Database1.mdb";

存放数据的中介变量

System.Data.DataTable dt = new System.Data.DataTable(); //注:此处与Excel的名称空间冲突,故使用全名

2.3 在窗体Load事件中添加代码显示数据

        //加载数据库
        private void dataBase_Load(object sender, EventArgs e)
        {
            OleDbConnection connection = new OleDbConnection(connectStr);
            connection.Open();
            OleDbCommand cmd = connection.CreateCommand();
            cmd.CommandText = "select * from fruit";
            OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
            DataSet ds = new DataSet();
            adapter.Fill(ds);
            dt = ds.Tables[0];
            dataGridView1.DataSource = dt;
            connection.Close();
            cmd.Dispose();
            connection.Dispose();
        }

2.4 数据库更新代码

//更新数据到数据库中
   private void btn_updataToDatabase_Click(object sender, EventArgs e)
        {
            OleDbConnection connection = new OleDbConnection(connectStr);
            connection.Open();
            OleDbCommand cmd = connection.CreateCommand();
            cmd.CommandText = "select * from fruit";
            OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
            OleDbCommandBuilder cmdBulid = new OleDbCommandBuilder(adapter);
            adapter.DeleteCommand = cmdBulid.GetDeleteCommand();
            adapter.InsertCommand = cmdBulid.GetInsertCommand();
            adapter.UpdateCommand = cmdBulid.GetUpdateCommand();
            adapter.Update((System.Data.DataTable)dataGridView1.DataSource);
            adapter.Dispose();
            cmdBulid.Dispose();
            cmd.Dispose();
            connection.Dispose();
        }

2.5 删除DataGridView数据记录代码

        //删除dataGridView中的记录
        private void btn_deleteDataItem_Click(object sender, EventArgs e)
        {
            int cnt = dataGridView1.SelectedRows.Count;
            for (int i = 0; i < cnt; i++)
            {
                DataRowView drv = dataGridView1.SelectedRows[i].DataBoundItem as DataRowView;
                drv.Delete();
            }
        }

2.6 更新数据库代码

        //更新数据到数据库中
        private void btn_updataToDatabase_Click(object sender, EventArgs e)
        {
            OleDbConnection connection = new OleDbConnection(connectStr);
            connection.Open();
            OleDbCommand cmd = connection.CreateCommand();
            cmd.CommandText = "select * from fruit";
            OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
            OleDbCommandBuilder cmdBulid = new OleDbCommandBuilder(adapter);
            adapter.DeleteCommand = cmdBulid.GetDeleteCommand();
            adapter.InsertCommand = cmdBulid.GetInsertCommand();
            adapter.UpdateCommand = cmdBulid.GetUpdateCommand();
            adapter.Update((System.Data.DataTable)dataGridView1.DataSource);
            adapter.Dispose();
            cmdBulid.Dispose();
            cmd.Dispose();
            connection.Dispose();
        }

2.7 输出到Excel代码

//导出数据到Excel表格中
        private void btn_ouputToExcel_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveDlg = new SaveFileDialog();
            saveDlg.Filter = "*.xls|*.xls";
            string outputStr;
            if (saveDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                Excel._Application myExcel;
                ThreadPool.QueueUserWorkItem(
                    (pp) => {
                        myExcel = new Microsoft.Office.Interop.Excel.Application();
                        Excel.Workbook p_wk = myExcel.Workbooks.Add();
                        Excel.Worksheet p_ws = (Excel.Worksheet)p_wk.Worksheets.Add();
                        for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
                        {
                            p_ws.Cells[i + 1, 1] = dataGridView1.Rows[i].Cells[0].Value.ToString();
                            p_ws.Cells[i + 1, 2] = dataGridView1.Rows[i].Cells[1].Value.ToString();
                            p_ws.Cells[i + 1, 3] = dataGridView1.Rows[i].Cells[2].Value.ToString();
                        }
                        p_wk.SaveAs(saveDlg.FileName);
                        ((Excel._Application)myExcel.Application).Quit();
                        this.Invoke((MethodInvoker)(() => { MessageBox.Show("导出到Excel成功", "提示信息"); }));
                    } );
            }
            outputStr = saveDlg.FileName;
            saveDlg.Dispose();
        }

3 界面展示

3.1 原始数据库及数据载入

20190520222700578.png

20190520222607379.png

3.2 删除和增加记录

20190520223010817.png

20190520223157554.png

3.3 数据库更新

20190520223723604.png

20190520223417523.png

3.4 导出到Excel

20190520223808374.png


4 总结及疑问

4.1 成果总结:

系统练习了使用C#进行数据库更新、删除和修改操作,并将dataGridView中的数据导出到Excel表格中;

4.2 仍存在的问题:

(1)数据库采用自动编号,我手动输入的ID与更新后的数据库ID不一致,有待深入研究改善;

(2)刷新ID仅仅是在DataGridView控件中进行的,并未实际更新到数据库中

相关文章
|
3月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
60 3
|
2月前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
116 12
|
3月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
114 4
|
4月前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。
232 0
|
9月前
|
开发框架 前端开发 .NET
C#编程与Web开发
【4月更文挑战第21天】本文探讨了C#在Web开发中的应用,包括使用ASP.NET框架、MVC模式、Web API和Entity Framework。C#作为.NET框架的主要语言,结合这些工具,能创建动态、高效的Web应用。实际案例涉及企业级应用、电子商务和社交媒体平台。尽管面临竞争和挑战,但C#在Web开发领域的前景将持续拓展。
260 3
|
9月前
|
SQL 开发框架 安全
C#编程与多线程处理
【4月更文挑战第21天】探索C#多线程处理,提升程序性能与响应性。了解C#中的Thread、Task类及Async/Await关键字,掌握线程同步与安全,实践并发计算、网络服务及UI优化。跟随未来发展趋势,利用C#打造高效应用。
238 3
|
5月前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
69 2
|
5月前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
110 11
|
5月前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
75 1

热门文章

最新文章