如何在不接收异常的情况下以编程方式更改绑定DataGridView的单元格值?

时间:2011-05-04 08:31:23

标签: vb.net winforms data-binding datagridview

我尝试以编程方式更改绑定的DataGridView的单元格内容时遇到问题。

我实现了一小段代码来显示问题。

执行以下步骤来复制问题:

  • 启动示例
  • 撰写标题内容以创建新行
  • CTRL + C插入标题
  • 移至网格的空行以强制创建新行
  • 标题单元格上的CTRL + V
  • 点击上一行(取消新行)
  • 再次单击空行以强制创建新行
  • 例外:由于对象的当前状态,操作无效。

这是代码:

Public Class Form1

    Private _dgv As New DataGridView
    Private _Movies As New System.ComponentModel.BindingList(Of Movie)

    Public Sub New()

        InitializeComponent()

        Me.Controls.Add(_dgv)

        _dgv.Dock = DockStyle.Fill
        _dgv.DataSource = _Movies

        AddHandler _dgv.KeyDown, AddressOf DataGridView_KeyDown

    End Sub

    Private Sub DataGridView_KeyDown(sender As Object, e As KeyEventArgs)

        If e.Control AndAlso e.KeyCode = Keys.V Then
            _dgv.CurrentCell.Value = Clipboard.GetText
        End If

    End Sub

    Public Class Movie
        Public Property Title As String
    End Class

End Class

我的实施确实存在问题,但我花了很多时间搜索解决方法但没有成功。提前感谢您提供给我的任何帮助。

2 个答案:

答案 0 :(得分:0)

在构造函数中设置表单时,请确保DataGridView的EditMode是DataGridViewEditMode.EditOnEnter。这使得我们粘贴的单元格在接收到焦点时立即进入编辑模式,并且如果我们离开它,则使新行粘贴而不是取消。

 Public Sub New()

    InitializeComponent()

    Me.Controls.Add(_dgv)

    _dgv.Dock = DockStyle.Fill
    _dgv.DataSource = _Movies

    AddHandler _dgv.KeyDown, AddressOf DataGridView_KeyDown

    _dgv.EditMode = DataGridViewEditMode.EditOnEnter
End Sub

然后,不是设置单元格值,而是设置基础Movie的Title属性:

Private Sub DataGridView_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)

    If e.Control AndAlso e.KeyCode = Keys.V Then
        Dim Mov As Movie = _Movies.Last
        Mov.Title = Clipboard.GetText
        _dgv.Refresh()
    End If

End Sub

在DataGridView中添加新行时,BindingList会自动将新的Movie对象添加到列表中。 _Movies.Last应该为您提供新添加的电影。

答案 1 :(得分:0)

为什么不使用DataGridView事件UserAddedRow?

system.windows.forms.datagridview.useraddedrow