将DataGridViewCell还原为用户更改之前的值

时间:2017-03-24 11:18:30

标签: vb.net datagridview

我有try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) { .... } 这样:

pic

用户可以更改DataGridView列,其他列只读。我提出了这个代码,如果用户在Quantidade上手动更改Quantidade的值,它会检查数据库以查看它是否有足够的库存。因此,如果用户输入的值小于库存总量,则它会正常更改,但我的问题是,如果用户输入的值大于库存值,我希望DataGridView返回到之前的值已被用户更改。

关于如何做到这一点的任何想法?

以下是活动的代码:

DataGridViewCell

请注意,此Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged 'this part is to check the total of the product in the db Dim Produtoid As String = DataGridView1.Rows(e.RowIndex).Cells(0).Value Dim tabelaqndDisponivel As DataTable = CAD.GetData("SELECT quantidadeExistenteProduto FROM Produto where idProduto = " & Produtoid) 'qntDisponivel is a integer that holds the total quantity of the product in the db Dim qntDisponivel As Integer = tabelaqndDisponivel.Rows(0).Item(0) If DataGridView1.Rows(e.RowIndex).Cells(2).Value <= qntDisponivel Then 'inserts normally Else 'now here the value on cell "quantidade" should revert End If End Sub 非常简单。它取自DataGridView ComboBox的值和Produto TextBox

中的文字

3 个答案:

答案 0 :(得分:2)

我经常使用的另一种方法是将其保存到.Tag,每个对象都有一个.Tag,如果你想在整个代码中使用它,它会保存全局声明变量。

虽然不一定是较短的代码,但它确实有时非常有用,而且我认为整体更整洁,因为您不必声明变量(您可以将其保存到单元格或行.Tag,但这是甚至更长的代码)。

在您的应用程序中使用:

Private Sub dataGridView1_CellValidating(ByVal sender As Object, ByVal e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
    DataGridView1.Tag = DataGridView1.Rows(e.RowIndex).Cells(2).Value
End Sub

检索:

Else
    'now here the value on cell "quantidade" reverts to the value before being changed  
    DataGridView1.Rows(e.RowIndex).Cells(2).Value = DataGridView1.Tag
End If

答案 1 :(得分:2)

我的回答是就代码的一些问题提供一些帮助。由于我们已经讨论了您的问题并且已经实施了修复,我认为解决这些问题是值得的。

转动Option Strict On

  

将隐式数据类型转换限制为仅扩展转换,禁止后期绑定,并禁止导致Object类型的隐式类型。

首先DataGridView1.Rows(e.RowIndex).Cells(0).ValueObject类型,因此要解决此问题,我们需要将.ToString()添加到其中:

Dim Produtoid As String = DataGridView1.Rows(e.RowIndex).Cells(0).Value.ToString()

第二个tabelaqndDisponivel.Rows(0).Item(0)DataGridView1.Rows(e.RowIndex).Cells(2).Value太类型Object。有了这些,我会使用Integer.TryParse处理。然后,您还可以正确检查Integer值:

Dim qntDisponivel As Integer = 0
Dim qnt As Integer = 0 'You can give this a more meaningful name
If Integer.TryParse(tabelaqndDisponivel.Rows(0).Item(0).ToString(), qntDisponivel) AndAlso
   Integer.TryParse(DataGridView1.Rows(e.RowIndex).Cells(2).Value.ToString(), qnt) Then

    If qnt <= qntDisponivel Then
        'inserts normally
    Else
        'now here the value on cell "quantidade" reverts to the value before being changed  
        DataGridView1.Rows(e.RowIndex).Cells(2).Value = valorqnt
    End If

Else
    'Haven't been able to check so revert
    DataGridView1.Rows(e.RowIndex).Cells(2).Value = valorqnt

End If

第三,DataGridView1.Rows(e.RowIndex).Cells(2).Value方法中CellValidating再次输入Object类型。使用Integer.TryParse进行更改:

Integer.TryParse(DataGridView1.Rows(e.RowIndex).Cells(2).Value.ToString(), valorqnt)

最后,您的SQL语句对 SQL注入开放。您需要查看SQL参数。在这个领域提供很多帮助是相当困难的,因为我看不出GetData做了什么,这将超出这个问题的范围,但绝对值得一提。

答案 2 :(得分:1)

所以我在这里做的是创建一个变量Private valorqnt As Integer,并在事件CellValidating上保存了值(在被用户更改之前)。

代码:

Private Sub dataGridView1_CellValidating(ByVal sender As Object, ByVal e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
    valorqnt = DataGridView1.Rows(e.RowIndex).Cells(2).Value
End Sub

这样我在更改之前就拥有了单元格的值。现在,在CellValueChanged事件中,我添加了DataGridView1.Rows(e.RowIndex).Cells(2).Value = valorqnt,因此我可以恢复该值。

代码:

Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
   'this part is to check the total of the product in the db
    Dim Produtoid As String = DataGridView1.Rows(e.RowIndex).Cells(0).Value
    Dim tabelaqndDisponivel As DataTable = CAD.GetData("SELECT quantidadeExistenteProduto FROM Produto where idProduto = " & Produtoid)
    'qntDisponivel is a integer that holds the total quantity of the product in the db
    Dim qntDisponivel As Integer = tabelaqndDisponivel.Rows(0).Item(0)

    If DataGridView1.Rows(e.RowIndex).Cells(2).Value <= qntDisponivel Then
        'inserts normally
    Else
        'now here the value on cell "quantidade" reverts to the value before being changed  
            DataGridView1.Rows(e.RowIndex).Cells(2).Value = valorqnt
    End If
End Sub