我有一个DataGridView,用我的数据库中的DataSet填充。我试图在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();
}
}
答案 0 :(得分:2)
在尝试保存更改之前,您应该结束当前编辑:
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
var cm = dataGridView1.BindingContext[ds, "Contact_List"];
cm.EndCurrentEdit();
da.Update(ds, "Contact_List");
}
其他一些说明
DataSet
。 DataTable
就足够了。SqlCommandBuilder
传递给构造函数来创建SqlDataAdapter
时,所有插入,更新和删除命令都将自动生成,您不需要自己做任何事情,所以{{1 }} 没有必要。 EndCurrentEdit
会导致您对IEditableObject
所做的更改保存到基础数据源。 GetUpdateCommand()
这是网格行后面的对象DataRowView
,您应该调用货币管理器的IEditableObject
,这会导致调用EndCurrentEdit
EndEdit
并提交更改基础DataRowView
并结束编辑会话。DataRow
,则调用BindingSource
的{{1}}也会这样做。EndEdit
。答案 1 :(得分:0)
这是因为你正在使用SqlCommandBuilder,我很久没有使用它了,我正在寻找更多信息,但我相信你只能更新一个表,没有连接,并且必须有一个独特的键定义,否则您可能希望手动生成UPDATE语句。