在winform中将mysql和DataGridView绑定使用,快速完成“增删改”

本人菜鸟,欢迎好心人,不欢迎喷子

我的环境::
vs2022 + mysql.Data.dll
mysql 5.7
Navicat

操作步骤

单表绑定(不涉及其他表中的字段)

应对需求:对 用户信息表、学生信息表 等单个表的增删改

  • 数据库部分

在数据库中创建一个表,可填入一些数据用来看效果。如图。在这里插入图片描述
注意:id为自动递增
在这里插入图片描述

  • winform界面部分

  1. 将一个DataGridView拖放到界面上,并添加对应的列。如图。
    正好对应数据库中的字段(不包含id)
  2. 设置每列的DataPropertyName为对应的字段名。如图。
    在这里插入图片描述
    在这里插入图片描述
    想不想绑定id字段都可以。我这里直接绑定是因为在绑定之后,id那一列可以设置为隐藏(列属性visible设置为false)。
  • 代码部分

  1. 将DataSet中的DataTable作为中间桥梁,完成mysql数据库表与DataGridView的绑定
		DataSet ds;
        MySqlDataAdapter adapter;
        MySqlCommandBuilder cb;
        
        private void show()
        {
   
            //创建DataSet集合,用来放置查询出来的数据
            ds = new DataSet();
            adapter = new MySqlDataAdapter("select * from test_table", Program.myDB.conn);//sql语句也可以带有where语句
            adapter.Fill(ds);   //将查询结果放入DataSet中(确切的说是放在ds.Tables[0]里面,类型为DataTable)
            cb = new MySqlCommandBuilder(adapter);//必需的,否则不能简单直接地将改动提交给mysql数据库。仅在单表中有效。
            //将DataTable表与界面上的DataGridView绑定,直接显示表中数据
            dataGridView3.DataSource = ds;
            dataGridView3.DataMember = ds.Tables[0].TableName;
        }
		private void Form4_Load(object sender, EventArgs e)
        {
   
            show();
        }

MysqlDataAdapter官方文档说明,其父类DbCommandBuilder官方文档说明
在这里插入图片描述

  1. “保存更改”按钮代码(button的click事件)
		//点击后将修改mysql数据库
		private void button1_Click(object sender, EventArgs e)
        {
   
            adapter.Update(ds.Tables[0]);//将改动提交给数据库
        }

注意:该按钮中的代码如果放到DataGridView.CellEndEdit事件中则没有效果,原因未知

  • 演示:增删改

    懒得演示。因为修改DataGridView的操作与Navicat中的基本一致,只需要额外点击“保存更改”按钮后才能提交至mysql数据库*

id 转换(DataGridView中的DataGridViewComboBoxColumn列绑定)

应对需求:数据库中的 id 需直接转化为其他字段信息,如校长查看某班班主任不是想看老师的id,而是想看老师的名字,并允许老板将其修改为其他老师。

DataGridViewComboBoxColumn比较特殊,除了拥有一个和其他列一样的DataPropertyName用来绑定主表中某一字段,自身还拥有一套独立的数据源用来“翻译”主表中此处的值。

  • 单表绑定(主表绑定)

mysql中的schedule表
winform界面
将课程表schedule作为主表绑定到dataGridView1显示

此时执行的话,则dataGridView显示的和mysql中的schedule表一模一样,id全都暴露出来了

  • 将暴露出id的列的类型从DataGridViewTextBoxColumn修改为DataGridViewComboBoxColumn

此处对class_id进行修改
在这里插入图片描述

  • 从关联的外表中获取id与所需字段,存入新的DataTable中

此处从class表中获取班级的id及班级名称
查询结果由DataTable class_list记录

  • 将新的DataTable绑定到DataGridViewComboBoxColumn上

//显示班级名称
DataGridViewComboBoxColumn dcc = dataGridView1.Columns["class_cb"] as DataGridViewComboBoxColumn;//班级那一列
dcc.DataSource = class_list;
dcc.DisplayMember = class_list.Columns["name"].ColumnName;//班级名字
dcc.ValueMember = class_list.Columns["id"].ColumnName;//班级id

运行效果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实际上此处变化的仍然是id值,只不过表面显示的是对应的班级名字,起到“翻译”的作用。

点击”保存更改“按钮,调用adapter_schedule.Update(ds_schedule);即可实际修改mysql数据
在这里插入图片描述
在这里插入图片描述

然而,adapter.Update()方法只能修改单个表,一旦其查询语句里带有其他表,便无法进行增删改(比如adapter=new MysqlDataAdapter("select A.stu_id,B.id,B.name from A left join B on A.stu_id=B.id,conn))
于是,该用下面的办法来替代Update方法了。虽然没有Update方法简便,但还是比我自己的笨办法好多了QAQ

一个DataGridView与多个mysql数据表绑定,完成“增删改”

应对需求: 用户看到的“报名表”包含学生个人基本信息和家长信息,可实际上是使用学生表+家长表拼接完成的。这种情况下需要“增删改”信息

  • “保存更改”按钮代码(改日再写,先贴上代码)

可先在MSDN中了解DataTable.GetChange()方法和DataRow.RowState属性

 		private void button1_Click(object sender, EventArgs e)
        {
            DataSet temp0=ds_entry_form.GetChanges();
            if(temp0==null)
            {
                Console.WriteLine("temp0为空");
                return;
            }
            DataTable temp = temp0.Tables[0];
            Console.WriteLine($"改动了{temp.Rows.Count}行");
       
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值