如何编辑绑定到绑定源的Datagridview中的单元格

时间:2013-12-13 18:01:06

标签: vb.net datagridview bindingsource

我有一个datagridview,在更新bindingsource时会更新。在具有实际数据的最后一行之后应该有一个空行。如果用户选择此行中的单元格,则应该能够将数据键入该单元格(就像它是文本框一样)。

我已将datagridview的“AllowUserToAddRows”属性设置为“true”;这会在数据的最后一行之后添加一个空行。但是,当用户单击该行时,将使用该字段的默认值填充单元格(在我的示例中为零)。

由于我绑定了datagridview列的属性是double类型,因此我似乎无法显示任何非数字值。

首先,是否可以将单元格留空或在单击时显示空字符串。其次,如何允许用户将数据输入某些单元格?

2 个答案:

答案 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