错误:”ListManager 的位置必须等于 rowNum“的原因

关于:

有关调用实时(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事件该有多好,就不会发生这样的事情了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值