如何在WPF与C#中点击按钮将Data Grid数据批量保存到数据库
在WPF C#中一键保存DataGrid全部数据到数据库的实现方法
我来给你一步步讲清楚怎么实现这个需求,其实很简单,分几个步骤来就行:
一、准备工作:确保DataGrid的数据源是可枚举集合
首先,你需要把DataGrid绑定到一个可枚举的集合(比如ObservableCollection<T>,它能自动同步UI和数据的变化,非常适合WPF场景)。先定义一个对应数据库表的实体类,比如假设你要保存产品数据:
// 实体类,对应数据库的Products表 public class Product { public int Id { get; set; } // 主键,新增时可以设为0 public string Name { get; set; } // 产品名称 public decimal Price { get; set; } // 产品价格 }
然后在你的窗口类或者ViewModel里声明这个集合:
// 绑定到DataGrid的数据源 public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>();
接着在XAML里给DataGrid设置绑定:
<DataGrid x:Name="ProductDataGrid" ItemsSource="{Binding Products}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="产品ID" Binding="{Binding Id}" /> <DataGridTextColumn Header="产品名称" Binding="{Binding Name}" /> <DataGridTextColumn Header="产品价格" Binding="{Binding Price}" /> </DataGrid.Columns> </DataGrid>
二、实现按钮点击保存的逻辑
这里给你两种常用的实现方式,选你顺手的就行:
方式1:用EF Core(ORM框架,代码更简洁)
EF Core是微软官方的ORM框架,能帮你省去写SQL的麻烦,先安装对应的NuGet包:
- 安装
Microsoft.EntityFrameworkCore - 再安装对应数据库的驱动,比如SQL Server就装
Microsoft.EntityFrameworkCore.SqlServer
首先定义DbContext(数据库上下文):
public class AppDbContext : DbContext { // 对应数据库的Products表 public DbSet<Product> Products { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 替换成你的数据库连接字符串 optionsBuilder.UseSqlServer("Server=.;Database=ProductDB;Trusted_Connection=True;TrustServerCertificate=True;"); } }
然后写按钮的点击事件:
private async void SaveAllButton_Click(object sender, RoutedEventArgs e) { try { using (var dbContext = new AppDbContext()) { // 区分新增和修改的记录:假设Id为0是新增的 foreach (var product in Products) { if (product.Id == 0) { dbContext.Products.Add(product); // 新增记录 } else { // 先从数据库找到现有记录,再更新字段 var existingProduct = await dbContext.Products.FindAsync(product.Id); if (existingProduct != null) { existingProduct.Name = product.Name; existingProduct.Price = product.Price; // 其他需要更新的字段同理 } } } await dbContext.SaveChangesAsync(); // 提交所有变更 MessageBox.Show("所有数据保存成功!"); } } catch (Exception ex) { MessageBox.Show($"保存失败:{ex.Message}"); } }
方式2:用ADO.NET(原生SQL,适合需要精细控制的场景)
如果你不想用ORM,直接写SQL也可以,代码如下:
private void SaveAllButton_Click(object sender, RoutedEventArgs e) { string connectionString = "Server=.;Database=ProductDB;Trusted_Connection=True;TrustServerCertificate=True;"; try { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); foreach (Product product in Products) { string sql; // 同样区分新增和修改 if (product.Id == 0) { sql = "INSERT INTO Products (Name, Price) VALUES (@Name, @Price)"; } else { sql = "UPDATE Products SET Name = @Name, Price = @Price WHERE Id = @Id"; } using (SqlCommand cmd = new SqlCommand(sql, conn)) { // 添加参数,防止SQL注入 cmd.Parameters.AddWithValue("@Name", product.Name); cmd.Parameters.AddWithValue("@Price", product.Price); if (product.Id != 0) { cmd.Parameters.AddWithValue("@Id", product.Id); } cmd.ExecuteNonQuery(); // 执行SQL } } MessageBox.Show("所有数据保存成功!"); } } catch (Exception ex) { MessageBox.Show($"保存失败:{ex.Message}"); } }
三、注意事项
- 确保你的数据库里已经创建了对应的表(比如Products表,字段和实体类对应)
- 一定要加异常捕获,避免程序崩溃,同时能给用户提示错误信息
- 如果你的DataGrid里只有新增数据(没有修改现有数据),可以直接用
AddRange(EF Core)或者批量插入SQL,效率更高
内容的提问来源于stack exchange,提问作者JIYA
相关产品推荐
相关产品推荐

