【问题标题】:How to change programmatically cell values of bound DataGridView without receiving exceptions?如何在不接收异常的情况下以编程方式更改绑定 DataGridView 的单元格值?
【发布时间】:2011-05-04 08:31:22
【问题描述】:

我在尝试以编程方式更改绑定 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

我的实现肯定有问题,但我花了很多时间寻找解决方法,但没有成功。提前感谢您能给我的任何帮助。

【问题讨论】:

  • DataGridView 绑定到什么?
  • @Casey 绑定到 BindingList(Of Movie),全部写在示例代码中。

标签: vb.net winforms data-binding datagridview


【解决方案1】:

在构造函数中设置表单时,确保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

然后,设置底层电影的 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 应该为您提供新添加的电影。

【讨论】:

  • 它适用于已经创建的行,但我怎样才能使 CTRL+V 也适用于新行?我希望在我将值粘贴到最后一行单元格时创建一个新行,但此时单元格内容已填充,但是当我单击任何先前的网格行时,最后一行创建被取消并且内容丢失。
  • @Drake 我正要提到这一点,但我认为这是你想要的行为。我会调查的。
  • @Drake 我想我知道了,检查我更新的答案,看看是否有效。
  • 谢谢,这是一个不错的技巧,也许我可以使用它,但实际上我制作的这个小例子隐藏了我面临的一个更大的问题。实际上,我需要一种在添加新行时以编程方式更改值的方法,以避免问题中提到的异常(“由于对象的当前状态,操作无效。”)
  • @Drake 你仍然对我发布的解决方案有异常吗?我想我有点困惑这个解决方案会出现什么问题。
【解决方案2】:

为什么不使用 DataGridView 事件 UserAddedRow?

system.windows.forms.datagridview.useraddedrow

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多