关于:
有关调用实时(JIT)调试而不是此对话框的详细信息,
请参阅此消息的结尾。
************** 异常文本 **************
System.ArgumentException: ListManager 的位置必须等于 rowNum。
是这样发生的事情:
我定义了一个datagridcomboboxcolumn列,然后在窗体中引用该列,但是一直不知道是什么原因,老是会出现上面的错误,经过无数次测试才发现是为的一个小问题。在重写edit事件中有:
Protected Overloads Overrides Sub Edit(ByVal source As System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, _
ByVal bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, _
ByVal instantText As String, ByVal cellIsVisible As Boolean)
MyBase.Edit(source, rowNum, bounds, [readOnly], instantText, cellIsVisible)
If ((Not [readOnly]) And cellIsVisible) Then
'save current row in the datagrid and currency manager associated with
'the data source for the datagrid
iRowNumber = rowNum '获取了当前的行值
cm = source
AddHandler MyBase.DataGridTableStyle.DataGrid.Scroll, AddressOf DataGrid_Scroll
'AddHandler MyBase.DataGridTableStyle.DataGrid.CurrentCellChanged, AddressOf Cell_Changed
cbo.Parent = MyBase.TextBox.Parent
Dim rect As Rectangle = MyBase.DataGridTableStyle.DataGrid.GetCellBounds(MyBase.DataGridTableStyle.DataGrid.CurrentCell)
cbo.Location = rect.Location()
cbo.Size = New Size(MyBase.TextBox.Size.Width, MyBase.TextBox.Size.Height)
cbo.SelectedIndex = cbo.FindStringExact(MyBase.TextBox.Text)
cbo.Show()
cbo.BringToFront()
cbo.Focus()
isCellChanged = False
End If
假设我的表格只有一列,并且就是那个combox列,那么在这种情况下另一个事件:
Sub cbo_leave(ByVal sender As Object, ByVal e As EventArgs)
' Dim rowView As DataRowView = CType(cbo.SelectedItem, DataRowView)
' Dim s As String
' If Not IsNothing(rowView) Then
' s = CType(rowView.Row(cbo.DisplayMember) & "", String)
' Else
' s = ""
' End If
SetColumnValueAtRow(cm, iRowNumber, cbo.Text)
' MyBase.Invalidate()
cbo.Hide()
MyBase.TextBox.BringToFront()
MyBase.TextBox.Focus()
MyBase.Commit(cm, iRowNumber)
isCellChanged = False
RemoveHandler MyBase.DataGridTableStyle.DataGrid.Scroll, AddressOf DataGrid_Scroll
'mybase.DataGridTableStyle.DataGrid
End Sub
并不会很好的发生,当行改变后并没有来得及leave,但是总要leave,只不过这个leave事件,先于datagrid.currentcellchanged发生,在这种情况下,也就是edit要比cbo_leave事件先发生,产生的唯一的后果就是rownumber和cbo_leave中的rownumer不一致了
因此我想,要是能有个beforecellchanged事件该有多好,就不会发生这样的事情了