仅允许 DataGridView 列的单元格中的特定值范围
Allow only specific value range in DataGridView Columns' cells
我正在推进这个项目,尽管进展缓慢。我几乎已将 DataGridView 设置为可以继续进行项目下一部分的位置。但是我发现我需要修复的最后一件事:
问题
我需要限制用户可以在 DGV 的每一列中输入的值的范围。例如:
- 第 0 列和第 1 列可以接受 0-3000 之间的值
- 第 2 列可以接受 0-20000 之间的值
- 第 3 列 (0-1000)
- 第 4 列 (0-320)
DGV 没有固定的行数,因为用户可以通过单击按钮添加所需的行数。我已经看到示例显示了在整个 DGV 甚至行中设置值范围的类似代码,但我无法找到任何内容或帮助显示如何为每列设置范围值。
我编写了一些用于单元格验证的代码,以确保只有整数值被输入到 DGV 中并且没有单元格为空。有没有办法添加或修改此代码以解决我当前的问题?如果是这样,有人可以提供一些帮助让我开始吗? - 谢谢你,新手。
Private Sub LftMtr_Data_Grid_CellValidating(ByVal sender As Object, _
ByVal e _
As DataGridViewCellValidatingEventArgs) _
Handles LftMtr_Data_Grid.CellValidating
Me.LftMtr_Data_Grid.Rows(e.RowIndex).ErrorText = ""
Dim newInteger As Integer
' Don't try to validate the 'new row' until finished
' editing since there
' is not any point in validating its initial value.
If LftMtr_Data_Grid.Rows(e.RowIndex).IsNewRow Then Return
If Not Integer.TryParse(e.FormattedValue.ToString(), newInteger) _
OrElse newInteger < 0 Then
e.Cancel = True
Me.LftMtr_Data_Grid.Rows(e.RowIndex).ErrorText = "Cells must not be null and must equal a non-negative integer"
End If
End Sub
看到您的验证与 here 在 MSDN 文档中看到的几乎相同,我相信您了解所有发生的事情。请注意,在该方法中访问单元格行索引。列索引也可以这样做。由于要根据列验证单元格值的上限,我们将使用此列索引来设置要检查的上限。
尝试在 Dim newInteger As Integer
之后但在 If 语句之前添加以下代码:
Dim upperLimit As Integer = 0
Select Case e.ColumnIndex
Case 0, 1
upperLimit = 3000
Case 2
upperLimit = 20000
Case 3
upperLimit = 1000
Case 4
upperLimit = 320
Case Else
Debug.WriteLine("You decide what should happen here...")
End Select
最后,修改您的 If 语句:
If Not Integer.TryParse(e.FormattedValue.ToString(), newInteger) _
OrElse newInteger < 0
OrElse newInteger > upperLimit Then
这应确保检查的每个单元格都在其列的可接受值范围内。
我正在推进这个项目,尽管进展缓慢。我几乎已将 DataGridView 设置为可以继续进行项目下一部分的位置。但是我发现我需要修复的最后一件事:
问题
我需要限制用户可以在 DGV 的每一列中输入的值的范围。例如:
- 第 0 列和第 1 列可以接受 0-3000 之间的值
- 第 2 列可以接受 0-20000 之间的值
- 第 3 列 (0-1000)
- 第 4 列 (0-320)
DGV 没有固定的行数,因为用户可以通过单击按钮添加所需的行数。我已经看到示例显示了在整个 DGV 甚至行中设置值范围的类似代码,但我无法找到任何内容或帮助显示如何为每列设置范围值。
我编写了一些用于单元格验证的代码,以确保只有整数值被输入到 DGV 中并且没有单元格为空。有没有办法添加或修改此代码以解决我当前的问题?如果是这样,有人可以提供一些帮助让我开始吗? - 谢谢你,新手。
Private Sub LftMtr_Data_Grid_CellValidating(ByVal sender As Object, _
ByVal e _
As DataGridViewCellValidatingEventArgs) _
Handles LftMtr_Data_Grid.CellValidating
Me.LftMtr_Data_Grid.Rows(e.RowIndex).ErrorText = ""
Dim newInteger As Integer
' Don't try to validate the 'new row' until finished
' editing since there
' is not any point in validating its initial value.
If LftMtr_Data_Grid.Rows(e.RowIndex).IsNewRow Then Return
If Not Integer.TryParse(e.FormattedValue.ToString(), newInteger) _
OrElse newInteger < 0 Then
e.Cancel = True
Me.LftMtr_Data_Grid.Rows(e.RowIndex).ErrorText = "Cells must not be null and must equal a non-negative integer"
End If
End Sub
看到您的验证与 here 在 MSDN 文档中看到的几乎相同,我相信您了解所有发生的事情。请注意,在该方法中访问单元格行索引。列索引也可以这样做。由于要根据列验证单元格值的上限,我们将使用此列索引来设置要检查的上限。
尝试在 Dim newInteger As Integer
之后但在 If 语句之前添加以下代码:
Dim upperLimit As Integer = 0
Select Case e.ColumnIndex
Case 0, 1
upperLimit = 3000
Case 2
upperLimit = 20000
Case 3
upperLimit = 1000
Case 4
upperLimit = 320
Case Else
Debug.WriteLine("You decide what should happen here...")
End Select
最后,修改您的 If 语句:
If Not Integer.TryParse(e.FormattedValue.ToString(), newInteger) _
OrElse newInteger < 0
OrElse newInteger > upperLimit Then
这应确保检查的每个单元格都在其列的可接受值范围内。