C# 获取更改前后datagridview中特定列的值

C# 获取更改前后datagridview中特定列的值,c#,winforms,ms-access,datagridview,C#,Winforms,Ms Access,Datagridview,我有一个自己解决不了的问题。在我开始之前,让你们知道这一点很重要 这个问题是我从头到尾写的,我想让你们正确理解我的问题是什么,对于那些懒于阅读的人,请原谅我,我这里没有附加任何代码,只是逻辑 也许这个论坛的人可以帮助我。但是,我已经找到了问题的解决方案(但只有逻辑,我无法用代码证明,也不知道从哪里开始) 好吧,我的情况如下: 我在DataGridView中获得了一个Quantity列,我还获得了一个功能,用户可以在DataGridView中编辑Quantity列并自动更新数据库中的Quantit

我有一个自己解决不了的问题。在我开始之前,让你们知道这一点很重要

这个问题是我从头到尾写的,我想让你们正确理解我的问题是什么,对于那些懒于阅读的人,请原谅我,我这里没有附加任何代码,只是逻辑

也许这个论坛的人可以帮助我。但是,我已经找到了问题的解决方案(但只有逻辑,我无法用代码证明,也不知道从哪里开始)

好吧,我的情况如下:

我在DataGridView中获得了一个Quantity列,我还获得了一个功能,用户可以在DataGridView中编辑Quantity列并自动更新数据库中的Quantity值。

例如(仍在案例中):

我在数据库中的数量为1000,我在系统中的数量列中输入50的值,然后通过单击“确定”按钮添加到DataGridView,一旦单击,数据库中的数量应将其从1000更新为950。因为我使用了一个公式
valueOfQuantityInDatabase-valueOfQuantityInSystem
它更新正确且成功

我的问题是:

假设我得到了一个带有Quantity列的DataGridView,其值为50(这使数据库中的Quantity值变为950)
假设客户希望将其数量从50添加到150,因此我将DataGridView中的Quantity值从50更改为150,当我单击“确定”按钮时,数据库应根据公式更新
数据库中QuantityInDatabase的值-系统中QuantityInSystem的值
,数据库中的数量应具有850的数量值
(因为1000-150)
,但这并不是我预期的,数据库中的数量值为800
(因为我第一次添加是50,所以数据库中的数量是950,接下来我再添加150,数据库中的数量是800)
所以它就像第一次输入的值+第二次输入的值。

这是我想要的:

每当用户在DataGridView中编辑数量时,它都应该转到以下公式
valueOfQuantityInDatabase-valueOfQuantityInSystem----(因此,每当用户更改DataGridView中的数量值时,比方说它从50更改为150,数据库中的数量应该识别它并减去DataGridView中数量的当前值(150),而不是旧值(50)

这是我的解决方案:

  • 获取更改前数据库中数量的第一个值(1000)

  • 获取用户通过以下公式添加的数量值
    更改后DataGridView中的数量-更改前DataGridView中的数量
    ,并使用以下公式将其相加
    更改后DataGridView中的数量-更改前DataGridView中的数量


  • 但是我不知道如何获得解决方案1或2。有人能帮我吗?非常感谢!我非常感谢你的回答!

    我建议你改变设计,改变你在数据库中更新数量的方式。我不知道gridview的数据源是什么。如果是项目列表,每当用户在网格不会更新对数据库的更改,而只是更新数据源,可能是订单项目列表中的值。只有当用户完成订单并单击“保存”按钮时,才应更新数量


    在这种方法中,您不必维护以前添加的产品的任何数量,用户可以随时更新数量,您不必跟踪它,这将使您的代码变得复杂。当用户单击“保存”时,只需在网格中获取当前数量,并只需更新数据库。

    有许多技术可以捕获一个在DataGridView(DGV)中的任何单元格中进行y更改。一种方法是利用DGV的两个事件:

  • CellBeginEdit
  • CellEndEdit
  • 这里是诀窍

    您可以在使用DGV计算值的类中声明两个私有字段(let、_oldValue&_newValue)。然后这两个事件的订阅可以如下所示:

    private void dataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        _oldValue = dataGridView[e.ColumnIndex, e.RowIndex].Value;
    }
    
    
    private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        _newValue = dataGridView[e.ColumnIndex, e.RowIndex].Value;
    
        if (_newValue != _oldValue)
        {
            // YOUR LOGIC SHOULD START FROM HERE
        }
    }
    
    现在我在关注你的问题

    如果要实现解决方案1,则可以将逻辑放在上述位置,以便在单元格第一次更改时保存其数据库值

    虽然解决方案2对我来说不够清楚,但您可以在上述位置执行以下操作:

    • 保存数据库值
    • 从数据库值中扣除_newValue
    • 将其存储回数据库

    但是每次单元格更改时调用数据库可能非常耗时。因此,您应该寻找任何快速的解决方案。

    是的,我已经可以获得网格中的当前数量,但我的问题是,在进行任何更改之前,我想根据数据库中的数量更新数据库。那么,更改是什么意思e?仅更改datagridview的逻辑或更改datagridview的整个设计?现在如何更新数据库中的数量?每次用户更改网格中的数量时,您也会更新数据库中的数量?是的,当用户向datagridview添加数据时,它会更新数据库中的数量,并将整个数据添加到表中,并显示it作为datagridview。当用户在datagridview中编辑数据时(当进行更改时),数据库中的数量将被更新。不建议使用这种方法。这很复杂。将项目列表绑定到网格,并添加保存按钮,并且仅当用户单击保存按钮时更新对数据库的更改,只要用户c