Windows Forms中如何将DataGridView新增行保存到MDF数据库
实现Windows Forms DataGridView新增行自动保存到MDF数据库
核心思路调整
你当前用RowLeave事件的思路方向没问题,但要实现最后一列按Tab后自动保存,更精准的方式是用CellLeave事件,结合判断当前单元格是否为最后一列、当前行是否为已输入内容的新增行,避免不必要的保存触发。
具体实现步骤
1. 绑定正确的事件
将保存方法绑定到DataGridView的CellLeave事件(替代原RowLeave),可以通过窗体设计器属性窗口操作,或者在frmCursanti_Load中手动添加绑定代码:
private void frmCursanti_Load(object sender, System.EventArgs e) { this.cursantiTableAdapter.Fill(this.colibriDataSet.Cursanti); // 手动绑定CellLeave事件 dgvCursanti.CellLeave += SaveToCursantiTable; }
2. 修改保存逻辑
更新SaveToCursantiTable方法,增加条件判断,确保仅在最后一列编辑完成且是已输入内容的新增行时执行保存:
private void SaveToCursantiTable(object sender, DataGridViewCellEventArgs e) { // 判断是否是最后一列,且当前行不是DataGridView的临时空行(已输入内容) if (e.ColumnIndex == dgvCursanti.Columns.Count - 1 && !dgvCursanti.Rows[e.RowIndex].IsNewRow) { try { // 验证当前控件输入合法性 this.Validate(); // 结束BindingSource编辑状态,将数据提交到DataSet this.cursantiBindingSource.EndEdit(); // 将DataSet的变更同步到数据库(自动识别新增/修改/删除操作) int affectedRows = this.cursantiTableAdapter.Update(this.colibriDataSet.Cursanti); if (affectedRows > 0) { MessageBox.Show("新增行保存成功!"); // 可选:若表有自增主键,刷新DataGridView显示数据库生成的主键值 this.cursantiTableAdapter.Fill(this.colibriDataSet.Cursanti); } } catch (System.Exception ex) { MessageBox.Show($"保存失败:{ex.Message}"); } } }
3. 关键细节说明
- 最后一列判断:
e.ColumnIndex == dgvCursanti.Columns.Count -1确保只有在最后一个单元格编辑完成后触发保存。 - 新增行判断:
!dgvCursanti.Rows[e.RowIndex].IsNewRow排除DataGridView默认的临时空行(用户未输入内容时的占位行),只处理已输入内容的有效新增行。 - TableAdapter Update方法:该方法会自动根据
colibriDataSet.Cursanti中数据行的RowState(Added/Modified/Deleted)执行对应的SQL操作,无需手动编写插入语句。 - 自增主键刷新:如果你的
Cursanti表包含自增主键,保存后重新调用Fill可以让DataGridView显示数据库生成的主键值。
4. 常见问题排查
- 若保存无报错但数据库无数据:检查
TableAdapter是否正确生成了Insert命令,可通过DataSet设计器右键点击TableAdapter,选择“配置”查看自动生成的SQL语句。 - 确保
colibriDataSet的Cursanti表结构与数据库表完全一致,避免字段类型、长度不匹配导致的静默失败。
内容的提问来源于stack exchange,提问作者Bogdan Doicin
相关产品推荐
相关产品推荐

