如何从虚拟未绑定 DataGridView 的编辑控件事件处理程序中强制提交当前行?



使用来自[[http://msdn.microsoft.com/de-de/library/15a31akc.aspx]]的讲解,我在VB 10 Express(我们谈论的是WinForms)中实现了虚拟模式下的DatagridView,完全不绑定。

我理解CommitEdit (DataGridViewDataErrorContexts.Commit)将当前单元格的内容提交到数据缓存。

示例使用行级提交,即它将值压入行缓冲区,直到当前行离开。只有这样行才会被添加到数据存储中(或在数据存储中更新)。我也是这么做的。

问题—我如何以编程方式提交当前行而不离开它?(我想提交整行,而不仅仅是当前单元格)

如果用户离开行,则存在一个RowValidatingRowValidatedRowEnter事件序列,在该序列中负责数据存储更新。因此,一个想法(目前我唯一的一个)是简单地将CurrentCell重置为Nothing,例如。

但我不能只是将DataGridViewCurrentCell属性设置为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序列:(这导致了不可重入的东西的间接递归调用。

最新更新