【问题标题】:Why wont DataGridView Update Database?为什么 DataGridView 不更新数据库?
【发布时间】:2016-12-12 08:08:22
【问题描述】:

我有一个使用我的数据库中的数据集填充的 DataGridView。我正在尝试在 DataGridView 中进行更改,并将这些更改应用到数据库,只要我按“Enter”。

我阅读了很多同样的问题,并研究了该主题,但仍然无法弄清楚为什么我无法将 DataGridView 中所做的更改应用于我的数据库。 (我知道之前有人问过这个问题,但仍然无法弄清楚)。

谁能告诉我我做错了什么?

DataSet ds = new DataSet();
string constring = System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
SqlDataAdapter da;
public ListForm()
{
    //Setting up DataGridView with data.
    InitializeComponent();
    da = new SqlDataAdapter("Select * from Contact_List", constring);

    SqlCommandBuilder cmb = new SqlCommandBuilder(da);
    da.UpdateCommand = cmb.GetUpdateCommand();
    da.Fill(ds, "Contact_List");
    dataGridView1.DataSource = ds;
    dataGridView1.DataMember = "Contact_List";
}

//Trying to update database with DataAdapter
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    using (SqlConnection con = new SqlConnection(constring))
    {
        con.Open();
        //I believe that the changes to the database should be applied here
        //Buts its not working
        da.Update(ds, "Contact_List",); 
        ds.AcceptChanges();
        con.Close();
    }  
}

【问题讨论】:

  • 您应该在尝试保存更改之前结束当前编辑。

标签: c# sql-server winforms datagridview ado.net


【解决方案1】:

您应该在尝试保存更改之前结束当前编辑:

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    var cm = dataGridView1.BindingContext[ds, "Contact_List"];
    cm.EndCurrentEdit();
    da.Update(ds, "Contact_List");
}

其他一些说明

  • 您不需要DataSetDataTable 就足够了。
  • 当您通过将SqlDataAdapter 传递给构造函数来创建SqlCommandBuilder 时,将自动生成所有插入、更新和删除命令,您不需要自己执行任何操作,因此不需要GetUpdateCommand()
  • 调用EndCurrentEdit 会导致您对IEditableObject 所做的更改被保存到基础数据源。 DataRowView 是网格行后面的对象是 IEditableObject 并且您应该调用货币经理的 EndCurrentEdit 导致 DataRowViewEndEdit 被调用并提交对基础 DataRow 的更改并结束编辑会话。
  • 如果您将网格绑定到 BindingSource,调用 EndEditBindingSource 将执行相同的操作。
  • 保存数据后,无需手动调用AcceptChanges
  • 您需要在代码中添加异常处理。

【讨论】:

  • 可能你知道,但我也应该说在更改每​​个单元格后保存更改不是一个好主意。
  • 这非常有效。也感谢您的补充说明。
【解决方案2】:

因为你用的是SqlCommandBuilder,好久没用了,正在找资料,不过我相信你只能更新一个表,不能join,而且必须有唯一的键已定义,否则您可能需要手动生成 UPDATE 语句。

reference

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多