Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在DataGrid上编辑多个单元格,然后保存到数据库_C#_Sql_Winforms_Datagrid - Fatal编程技术网

C# 在DataGrid上编辑多个单元格,然后保存到数据库

C# 在DataGrid上编辑多个单元格,然后保存到数据库,c#,sql,winforms,datagrid,C#,Sql,Winforms,Datagrid,我想在DataGrid中编辑多个单元格,当单击BTNuUpdate时,我编辑的单元格将在数据库中更新 我已经尝试了btnUpdate的ff代码: DialogResult res = MessageBox.Show("Are you sure you want to apply changes?", "Confirm", MessageBoxButtons.YesNo); if (res == DialogResult.Yes) { fo

我想在DataGrid中编辑多个单元格,当单击BTNuUpdate时,我编辑的单元格将在数据库中更新

我已经尝试了btnUpdate的ff代码:

DialogResult res = MessageBox.Show("Are you sure you want to apply changes?", "Confirm", MessageBoxButtons.YesNo);
        if (res == DialogResult.Yes)
        {
            foreach (DataGridViewRow row in dgMain.SelectedRows)
            {
                DataTable d = dgMain.DataSource as DataTable;
                long attendanceid = Convert.ToInt64(row.Cells["Attendance_Id"].Value.ToString());
                EmployeeAttendance a = new EmployeeAttendance();
                a.ProcAccountingAttendance_Update(attendanceid);
            }               
            MessageBox.Show("Changes Successfully Saved!");
        }

但问题是它仍然没有更新数据库。

第一个问题是您只需要执行
selectedRows
,这意味着如果您更改了多个值,并且只选择了一行,则只会更新其中一行

下一个问题是,您正在浏览所有选定的行,有更改的行和没有更改的行

在你的位置上,我要做的是:

  • 创建如下所示的公共类:
类别:

public class ChangedData
{
    public Object primaryKey;
    public Object columnName;
    public Object columnValue;
}
  • 创建
    公共列表变更数据在表单中
  • 调用
    cellValidating
    事件并在其内部检查新旧值是否不同,如果它们不同,则执行
    changedData.Add(new changedData{primaryKey=primaryKeyOfYourTable,columnName=dataGridView1.Columns[e.ColumnIndex].Name,columnValue.FormattedValue})
  • 最后,当你按下更新按钮,你就可以开始了
这:


我写的代码没有经过测试,需要编辑,因为您没有向我们提供任何代码或数据库结构。如果您需要其他内容,请编辑答案或评论。

更新:我终于解决了ff代码的问题: 顺便说一句,我正在为我的数据库使用一个存储过程

private void dgMain_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        string id = dgMain.Rows[e.RowIndex].Cells["Attendance_Id"].Value.ToString();
        string columnname = dgMain.Columns[e.ColumnIndex].Name;
        string value = dgMain.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
        EmployeeAttendance a = new EmployeeAttendance();
        a.ProcAccountingAttendance_UpdateByGroupIdDateFromTo(Convert.ToInt64(id),columnname,value);
    }

我看不到数据表和更新方法调用之间有任何链接。更新方法实际上在做什么?如果使用DataAdapter加载用于填充网格的datatable,则只需将datatable传递给其更新方法
private void dgMain_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        string id = dgMain.Rows[e.RowIndex].Cells["Attendance_Id"].Value.ToString();
        string columnname = dgMain.Columns[e.ColumnIndex].Name;
        string value = dgMain.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
        EmployeeAttendance a = new EmployeeAttendance();
        a.ProcAccountingAttendance_UpdateByGroupIdDateFromTo(Convert.ToInt64(id),columnname,value);
    }