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

已绑定数据源的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:45:03