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

如何将DataGridView行保存为Person类对象并优雅存入数据库?

问题解决方案

1. 先修正Person类的错误

你的Person类存在重复定义DateOfBirth的问题(字段与同名方法冲突),且建议使用属性而非公共字段(数据绑定对属性支持更完善),修正后代码如下:

public class Person
{
    public string Name { get; set; }
    public string FirstName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

2. 解决DataGridView绑定后无法添加数据的问题

List<T>不支持数据绑定的动态变更通知,改用BindingList<T>作为数据源,它实现了IBindingList接口,可与DataGridView双向联动:

// 窗体加载事件中初始化
private void Form_Load(object sender, EventArgs e)
{
    BindingList<Person> personList = new BindingList<Person>();
    dataGridView1.DataSource = personList;
    // 允许用户添加新空白行
    dataGridView1.AllowUserToAddRows = true;
    // 自动生成Person类对应的列
    dataGridView1.AutoGenerateColumns = true;
}

这样打开窗体时,DataGridView会自动生成对应Person属性的列,底部显示空白行供用户直接输入数据。

3. 优雅获取输入的Person对象列表

由于使用BindingList<Person>绑定,用户输入的内容会自动映射为Person对象,无需手动遍历单元格,直接从数据源提取即可:

// 过滤掉未输入有效内容的行(按需调整判断条件)
var validPersons = ((BindingList<Person>)dataGridView1.DataSource)
    .Where(p => !string.IsNullOrWhiteSpace(p.Name) || !string.IsNullOrWhiteSpace(p.FirstName))
    .ToList();

4. 优雅存入数据库

推荐使用ORM框架简化数据库操作,避免手动编写重复SQL:

示例1:Entity Framework Core

假设已配置好DbContext:

using (var dbContext = new YourDbContext())
{
    dbContext.Persons.AddRange(validPersons);
    dbContext.SaveChanges();
}

示例2:Dapper

using (var connection = new SqlConnection("你的数据库连接字符串"))
{
    string sql = "INSERT INTO Persons (Name, FirstName, DateOfBirth) VALUES (@Name, @FirstName, @DateOfBirth)";
    connection.Execute(sql, validPersons);
}

内容的提问来源于stack exchange,提问作者user12567285

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:50:53