C#DataGrid自动将值写入DB

时间:2010-10-12 09:56:12

标签: c# visual-studio-2010 datagridview

我有一个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:

TblObject

我在此gridview中选择了数据集作为数据源:

alt text

1 个答案:

答案 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网站的链接以获取更多信息。也许你会在那里找到答案。

至于你的问题的解决方案,似乎你可以把你的事件留下来,只需调用更新命令。我不确定这个原因我没有时间检查这个,我对这个问题没什么经验。

嗯,希望这会对你有所帮助..