我有一个datagrid视图,显示来自数据库的表数据
环境: - C#4.0 - SQL Server 2005 - Visual Studio 2010
我想要的是:在行到行的基础上自动保存更改。所以当我编辑第一行然后离开行时。它应该保存对数据库的更改。
我用过这段代码:
在From1载入中:
dataSet1.TblObject.RowChanged += rowUpdate;
事件处理程序:
private void rowUpdate(object sender, DataRowChangeEventArgs e)
{
DataRow dr = e.Row;
if (dr.RowState == DataRowState.Modified)
{
tblObjectTableAdapter.Update(dr);
}
}
当我在网格中编辑了一行时,调用tblObjectTableAdapter.Update(dr);
将数据存储到表中。这很好。但事件继续触发,好像它是递归调用的。因此tblObjectTableAdapter.Update(dr);
导致dataSet1.TblObject.RowChanged
事件。但我不能区分他们两个。我猜我正在使用错误的事件来存储我的值,但我找不到任何对我来说合乎逻辑的事件。我做错了什么?
我制作了一个数据集xsd:
我在此gridview中选择了数据集作为数据源:
答案 0 :(得分:0)
好的,我现在几次看了你的帖子,而我却无法直接解决你的问题。无论如何我会尝试,你想要的是,当我进行更改时,它不会立即更新,而是将信息保存在列表中,当你按下按钮保存更新时?
然后你应该创建一个Datarows列表,每次更改一行时都会将该项添加到列表中,这样就不会直接进行更新,只有当你按下按钮时才能进行更新。 (出于性能考虑,这也更好。)
所以代替代码
DataRow dr = e.Row;
if (dr.RowState == DataRowState.Modified)
{
tblObjectTableAdapter.Update(dr);
}
你应该做
DataRow dr = e.Row;
if (dr.RowState == DataRowState.Modified)
{
DatarowLst.Add(dr);
}
ButtonSave_Click(object sender, eventargs e)
{
foreach (DataRow d in DatarowLst)
{
tblObjectTableAdapter.Update(d);
}
}
修改强>
很抱歉误解了你。我现在理解你的问题,并研究了这个问题。
我在数据适配器和表中找到了一些有趣的信息。似乎适配器执行行到行检查以获取有关所做更改的信息。(即它是否需要更新或删除命令?)因此,我的GUESS是这会触发更新发生,因此再次调用您的事件,并递归地运行该方法。
在REMARK上发现的信息:This site from msdn
他们提供了this网站的链接以获取更多信息。也许你会在那里找到答案。
至于你的问题的解决方案,似乎你可以把你的事件留下来,只需调用更新命令。我不确定这个原因我没有时间检查这个,我对这个问题没什么经验。
嗯,希望这会对你有所帮助..