0

我正在继承 DataGridView 以扩展和绑定一些常见的功能。
在这里,我覆盖了几个(大约 10 个)事件,除了 onPaint 事件之外一切正常。

代码:

Imports System.ComponentModel

Public Class xDataGridView
Inherits DataGridView

Private _selected_row As Integer
Protected Overrides Sub onPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

    sel_row = Me.CurrentRow.Index + 1
    MyBase.OnPaint(e)
End Sub

<Browsable(True)> _
Public Property sel_row() As Integer
    Get
        Return _selected_row
    End Get
    Set(ByVal Value As Integer)
        _selected_row = Value
    End Set
End Property
End Class

在包含 _Paint 事件处理程序下的此类的主窗体中,我想将选定的行作为公共属性: mySel_row = myDGV.sel_row
当我尝试在 VBIDE 中打开主窗体的设计器时,代替 DGV 是红色的大红色“X”边界。

System.NullReferenceException:对象引用未设置为对象的实例。

但是,如果我启动一个程序,它可以正常工作。此类中的所有其他事件也可以正常工作,并且不会报告。

这个错误的原因可能是什么?

4

1 回答 1

1

我认为您的问题是设计视图中 datagridview 的当前行可能为空。这就是导致 System.NullReferenceException 的原因,如果您阅读出现并告诉您错误的消息框,它可能会说错误在这一行:sel_row = Me.CurrentRow.Index + 1. 解决此问题的一种方法是执行以下操作:

Protected Overrides Sub onPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

    If (Not IsNothing(Me.CurrentRow)) Then sel_row = Me.CurrentRow.Index + 1
    MyBase.OnPaint(e)
End Sub

我粘贴了您发布的代码并得到了您所做的错误,并添加此条件语句以检查当前行是否为空,以防止在您处于设计视图时引发异常。(您必须构建项目以消除控件中的错误消息。)HTH

于 2013-08-19T23:50:37.293 回答