使用[[http://msdn.microsoft.com/de-de/library/15a31akc.aspx]]的演练,我在VB 10 Express中以虚拟模式实现了DatagridView
,完全未绑定(我们正在谈论WinForms)。
我知道CommitEdit (DataGridViewDataErrorContexts.Commit)
会将当前单元格的内容提交到数据缓存。
该示例使用行级提交,即它将值推送到行缓冲区,直到剩下当前行。只有这样,行才会被添加到数据存储中(或更新)。这也正是我所做的。
问题 - 如何在不离开的情况下以编程方式提交当前行?(我想提交整行,而不仅仅是当前单元格。)
如果用户离开该行,则会有RowValidating
,RowValidated
,RowEnter
事件序列,其中会处理数据存储更新。因此,一个想法(目前我唯一的想法)就是简单地将CurrentCell
重新设置为Nothing
。
但我不能将DataGridView
的{{1}}属性设置为CurrentCell
(或当前行之外的任何单元格),因为我想在一个事件处理程序中提交由自定义列创建的自定义修改控件,我在那里设置Nothing
时看到System.InvalidOperationException
例外。
实际上,它是组合框右边的一个小按钮,即我创建了一个CurrentCell
后代,它是DataGridViewComboBoxCell
后代的编辑控件。我特殊的ComboBox单元格添加了一个小按钮,它应该提交当前行。不幸的是,该按钮的DataGridViewComboBoxColumn
事件处理程序无法更改_Click
,因为CurrentCell
会抛出异常。
显然,我必须延迟DetachEditingControl
重新分配,直到整个CurrentCell
事件被处理完毕。或者是什么?我该怎么做 - 向我注册一个自定义的Windows消息,_Click
,并覆盖表单的窗口过程,以便在收到此消息时重新设置SendMessage
? (喂?)
应该有一种相当简单的方法让CurrentCell
通过触发我处理以执行数据存储区更新的事件来提交所有更改,不是吗?
我希望我所说的有点清楚。我还没有紧凑的代码示例:(
答案 0 :(得分:2)
这是提交当前行的可靠方法:
' 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序列:(导致对非重入内容的间接递归调用。