如何将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
相关产品推荐
相关产品推荐

