我有一个datagridview,在更新bindingsource时会更新。在具有实际数据的最后一行之后应该有一个空行。如果用户选择此行中的单元格,则应该能够将数据键入该单元格(就像它是文本框一样)。
我已将datagridview的“AllowUserToAddRows”属性设置为“true”;这会在数据的最后一行之后添加一个空行。但是,当用户单击该行时,将使用该字段的默认值填充单元格(在我的示例中为零)。
由于我绑定了datagridview列的属性是double类型,因此我似乎无法显示任何非数字值。
首先,是否可以将单元格留空或在单击时显示空字符串。其次,如何允许用户将数据输入某些单元格?
答案 0 :(得分:1)
尝试使用CellFormatting事件:
Private Sub dgv_CellFormatting(sender As Object, _
e As DataGridViewCellFormattingEventArgs) _
Handles dgv.CellFormatting
If (e.ColumnIndex = 0) Then
If e.Value IsNot Nothing AndAlso DirectCast(e.Value, Double) = 0 Then
e.Value = String.Empty
e.FormattingApplied = True
End If
End If
End Sub
Double类型不适合进行比较。请考虑使用Decimal类型。
尝试将新行的单元格保持为“空白”,直到用户“触摸”它们为止,需要在新行的每个单元格上使用标记进行黑客攻击,因此以下是使用Tag属性的示例:
Dim rowEditing As Integer = -1
Private Sub dgv_RowEnter(sender As Object, _
e As DataGridViewCellEventArgs) _
Handles dgv.RowEnter
If e.RowIndex = dgv.NewRowIndex Then
rowEditing = e.RowIndex
For i As Integer = 0 To dgv.Columns.Count - 1
dgv.Rows(rowEditing).Cells(i).Tag = "tagged"
Next
End If
End Sub
Private Sub dgv_RowLeave(sender As Object, _
e As DataGridViewCellEventArgs) _
Handles dgv.RowLeave
If rowEditing > -1 Then
For i As Integer = 0 To dgv.Columns.Count - 1
dgv.Rows(rowEditing).Cells(i).Tag = String.Empty
Next
rowEditing = -1
End If
End Sub
Private Sub dgv_CellEndEdit(sender As Object, _
e As DataGridViewCellEventArgs) _
Handles dgv.CellEndEdit
If e.RowIndex = rowEditing AndAlso e.ColumnIndex = 1 Then
dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Tag = String.Empty
End If
End Sub
Private Sub dgv_CellFormatting(sender As Object, _
e As DataGridViewCellFormattingEventArgs) _
Handles dgv.CellFormatting
If e.RowIndex = rowEditing AndAlso e.ColumnIndex = 1 Then
If dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Tag IsNot Nothing AndAlso _
dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Tag = "tagged" Then
If e.Value IsNot Nothing Then
e.Value = String.Empty
e.FormattingApplied = True
End If
End If
End If
End Sub
此示例仅测试第二列,其类型为Double。
答案 1 :(得分:0)
我做了一个非常简单的调整。 DataGridView_DoubleClick 事件内部:
With Me.DataGridView
Select Case .Columns(e.ColumnIndex).HeaderText'or preferred variable
Case "Qty"
Dim v As Object = InputBox("Enter positive numeric value for " & .Columns(e.ColumnIndex).HeaderText,
.Columns(e.ColumnIndex).HeaderText & " Value", .Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
If Not IsNumeric(v) OrElse CInt(v) < 0 Then
MsgBox("You must enter a positive numeric value", MsgBoxStyle.OkOnly, "Invalid Entry")
Exit Sub
End If
Me.DataGridView.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = v
End Select
End With