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

Posted

技术标签:

【中文标题】在 DataGrid 上编辑多个单元格,然后保存到数据库【英文标题】:Edit Multiple Cells on DataGrid then Save to database 【发布时间】:2018-08-18 19:55:07 【问题描述】:

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

我试过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!");
        

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

【问题讨论】:

我没有看到你的数据表和更新方法调用之间有任何联系。你的更新方法实际上在做什么? 如果您使用 DataAdapter 加载用于填充网格的数据表,您只需将 DataTable 传递给其 Update 方法 【参考方案1】:

第一个问题是您只通过selectedRows 这意味着如果您更改了多个值并且毕竟您只选择了一行,那么只有那一行会被更新。

下一个问题是您要遍历所有选定的行,有变化的行和没有变化的行。

我会代替你做的是:

像这样创建公共类:

类:

public class ChangedData

    public Object primaryKey;
    public Object columnName;
    public Object columnValue;

在您的表单中创建public List<ChangedData> changedData; 调用cellValidating事件并在其中检查旧值和新值是否不同,如果它们不同则执行changedData.Add(new ChangedData primaryKey = primaryKeyOfYourTable, columnName = dataGridView1.Columns[e.ColumnIndex].Name, columnValue.FormattedValue ); 最后当你按下更新按钮时

这个:

using(SqlConnection con...)

    con.Open();
    using(SqlCommand cmd = new SqlCommand("UPDATE YOURTABLE SET @ColumnName =  @ColumnValue where PrimaryKeyColumn = @PrimaryKey", con);
    
        cmd.Parameters.Add("@ColumnName");
        cmd.Parameters.Add("@ColumnValue");
        cmd.Parameters.Add("@PrimaryKey");

        foreach(ChangedData cd in changedData)
        
            cmd.Parameters["@ColumnName"].Value = cd.columnName.ToString();
            cmd.Parameters["@ColumnValue"].Value = cd.columnValue.ToString();
            cmd.Parameters["@PrimaryKey"].Value = cd.primaryKey.ToString();

            cmd.ExecuteNonQuery();
        
    
    con.Close();

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

【讨论】:

【参考方案2】:

UPDATE:我终于解决了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);
    

【讨论】:

以上是关于在 DataGrid 上编辑多个单元格,然后保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

EasyUi DataGrid中数据编辑方式及编辑后数据获取,校验处理

easyui怎么给某一单元格,点击保存前后颜色改变

如何观察 DataGrid 的单元格被编辑的事件?

在WPF DataGrid中按Enter键时将焦点移动到下一个单元格?

突出显示 WPF DataGrid 的已编辑单元格

Xceed DataGrid:使用键盘导航编辑单元格