我有try (StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw)) {
....
}
这样:
用户可以更改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
答案 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)
我的回答是就代码的一些问题提供一些帮助。由于我们已经讨论了您的问题并且已经实施了修复,我认为解决这些问题是值得的。
将隐式数据类型转换限制为仅扩展转换,禁止后期绑定,并禁止导致Object类型的隐式类型。
首先DataGridView1.Rows(e.RowIndex).Cells(0).Value
是Object
类型,因此要解决此问题,我们需要将.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