You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:24:52