使用来自[[http://msdn.microsoft.com/de-de/library/15a31akc.aspx]]的讲解,我在VB 10 Express(我们谈论的是WinForms)中实现了虚拟模式下的DatagridView
,完全不绑定。
我理解CommitEdit (DataGridViewDataErrorContexts.Commit)
将当前单元格的内容提交到数据缓存。
示例使用行级提交,即它将值压入行缓冲区,直到当前行离开。只有这样行才会被添加到数据存储中(或在数据存储中更新)。我也是这么做的。
问题—我如何以编程方式提交当前行而不离开它?(我想提交整行,而不仅仅是当前单元格)
如果用户离开行,则存在一个RowValidating
、RowValidated
、RowEnter
事件序列,在该序列中负责数据存储更新。因此,一个想法(目前我唯一的一个)是简单地将CurrentCell
重置为Nothing
,例如。
但我不能只是将DataGridView
的CurrentCell
属性设置为Nothing
(或当前行之外的任何单元格),因为我想从自定义列创建的自定义编辑控件的事件处理程序中提交,并且我在设置CurrentCell
时看到System.InvalidOperationException
异常。
事实上,它是一个小按钮右边的组合框,即我创建一个DataGridViewComboBoxCell
后裔,这是DataGridViewComboBoxColumn
后裔的编辑控件。我的特殊ComboBox单元格添加了一个应该提交当前行的小按钮。不幸的是,该按钮的_Click
事件处理程序不能改变CurrentCell
,因为DetachEditingControl
会抛出异常。
显然,我必须延迟CurrentCell
重新分配,直到整个_Click
事件被处理。还是别的什么?我该如何做到这一点——注册一个自定义的Windows消息,SendMessage
那一个给我,并覆盖窗体的Windows过程,以便在收到此消息时重新设置CurrentCell
?(你好吗?)
应该有一个相当简单的方法,让DataGridView
通过触发事件,我处理执行数据存储更新提交所有更改,不是吗?
我希望你能明白我在说什么。我还没有一个紧凑的代码示例:(
下面是提交当前行的可靠方法:
' Optional: mark the current cell as dirty so the current row definetely will be
' commited:
MyDataGridView.NotifyCurrentCellDirty(True)
' Aktuelle Row commiten. Einen besseren Weg als "Keine Zelle selektieren, dann Originalzelle wieder selektieren" kenne ich nicht:
Dim OrigCellAddress As Point = New Point(MyDataGridView.CurrentCellAddress.X, MyDataGridView.CurrentCellAddress.Y)
MyDataGridView.CurrentCell = Nothing
MyDataGridView.CurrentCell = MyDataGridView.Rows(OrigCellAddress.Y).Cells(OrigCellAddress.X)
异常的问题是我在RowEnter事件处理程序中执行的BeginEdit/EndEdit序列:(这导致了不可重入的东西的间接递归调用。