已绑定数据源的DataGridView无法使用Rows.Add()添加新行如何解决
问题根因
DataGridView绑定DataSource后,禁止直接操作Rows集合增删改数据,所有数据操作必须针对绑定的数据源本身执行。你之前的代码失效是因为devents是Openbutton_Click中的局部变量,在SaveButton_Click的作用域中无法访问该数据源实例。
解决步骤
步骤1:将绑定的DataTable提升为窗体级全局变量
在你的窗体类的成员定义区域添加如下代码:
// 窗体类成员,全局可访问 private DataTable _devents;
步骤2:修改Openbutton_Click的绑定逻辑
将原方法中局部的devents改为全局变量赋值:
private void Openbutton_Click(object sender, EventArgs e) { OpenReport(); EventClass eventData = new EventClass(); // 赋值给全局变量 _devents = eventData.Load_downtimes(); dataGridView3.DataSource = _devents; }
步骤3:修改SaveButton_Click的行操作逻辑
直接操作全局的_devents数据源完成行添加,绑定的DataGridView会自动同步更新,无需手动调用Update/Refresh:
private void SaveButton_Click(object sender, EventArgs e) { // 原代码的单&为按位与,逻辑判断场景改用&&逻辑与更合理 if (start_tab == start_picker.ToString("dd-MM-yyyy HH:mm:00") && stop_tab != stop_picker.ToString("dd-MM-yyyy HH:mm:00")) { DateTime new_starttime = stop_picker; DateTime new_stoptime = Convert.ToDateTime(stop_tab); int new_cycletime = Convert.ToInt32(dataGridView3.Rows[dataGridView3.CurrentRow.Index].Cells["cycle_time"].Value) - Convert.ToInt32(textBox32.Text); // 操作绑定的数据源添加新行 DataRow newRow = _devents.NewRow(); newRow["start_time"] = new_starttime; newRow["stop_time"] = new_stoptime; newRow["cycle_time"] = new_cycletime; _devents.Rows.Add(newRow); // 移除旧行 _devents.Rows.RemoveAt(dataGridView3.CurrentCell.RowIndex); } }
注意事项
- 保证
newRow赋值时使用的列名start_time、stop_time、cycle_time和Load_downtimes返回的DataTable列名完全一致,避免引发列不存在的异常 - 若需要将修改后的数据持久化到数据库,操作完
_devents后需要调用EventClass中对应的保存方法,将DataTable的改动提交到数据库
内容的提问来源于stack exchange,提问作者Maltion
相关产品推荐
相关产品推荐

