子类化DatagridView,onPaint事件

时间:2013-08-19 23:23:29

标签: vb.net datagridview

我正在继承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就是大红色&#39; X&#39;带红色边框。

  

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

但如果我开始一个程序它正常工作。 此课程中的所有其他事件也能正常工作,并且不会报告。

导致此错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

我认为您的问题是设计视图中datagridview的当前行可能为null。这就是造成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

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