投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/10/27 11:13:41
CustomDataGridView ではなく
CustomDatagridView になっている点が気になりますが、それはさておき。


> 以下の方法で、解決しましたので
そのコードだとエラーになりませんか?

> Me.DataGridView.OnRowHeaderCheckboxChanged()
上記を下記のようにすれば、一応コンパイルが通るようにはなりましたが。
DirectCast(Me.DataGridView, CustomDatagridView).OnRowHeaderCheckboxChanged()


まぁ、RaiseEvent の後に全角スペースが入っていたり、
RowHeaderCheckboxChanged の後の括弧が全角括弧になっていたので、
実際のコードとは異なっているが故のことではあるのでしょうけれども。

とはいえ現状の実装だと、どの行がクリックされたのかと言う情報が
失われてしまっている点が気がかりです。

イベントの発火タイミングを DataGridViewRowHeaderCell.OnClick にするにしても、
DataGridView.OnCellClick にするにしても、イベントを利用するフォーム側で、
どの行をクリックされたのかを特定できるようにするため、
> Public Event RowHeaderCheckboxChanged()
> Friend Sub OnRowHeaderCheckboxChanged()
>   RaiseEvent RowHeaderCheckboxChanged()
> End Sub
の部分は下記のようにした方が、利用者にとっては使いやすいイベントになるかと。
Public Event RowHeaderCheckboxChanged As DataGridViewRowEventHandler
Friend Sub OnRowHeaderCheckboxChanged(e As DataGridViewRowEventArgs)
    RaiseEvent RowHeaderCheckboxChanged(Me, e)
End Sub


上記を CustomRowHeader 側から呼び出すのであればこんな感じ。
Dim dgv = TryCast(Me.DataGridView, CustomDatagridView)
If dgv IsNot Nothing Then
    dgv.OnRowHeaderCheckboxChanged(New DataGridViewRowEventArgs(Me.OwningRow))
End If



それと、CustomRowHeader 側ですが、
> Protected Overrides Sub OnClick(e As DataGridViewCellEventArgs)
>  Me.DataGridView.OnRowHeaderCheckboxChanged()
> End Sub
OnClick をオーバーライドした際に、
元の MyBase.OnClick を呼び忘れているように見えます。

このままだと「CustomRowHeader を継承したクラス」において
Click イベントが発生しないという事態を引き起こしてしまいます。

それとも、あえて意図的に握りつぶしているのでしょうか?

メソッドをオーバーライドするのでれば、基底クラスのメソッドも
呼び出すようにするべきだと思いますし、もし、そもそも
CustomRowHeader をこれ以上継承する予定がないのであれば、
Public NotInheritable Class にしてしまった方が良いでしょう。


この点は、CustomDatagridViewでも同じです。
今後の継承までを考えた設計にしていないなら、
NotInheritable にしておいた方が問題が少ないかと。

逆に、NotInheritable を付与しないのであれば、
さらなる継承が行われることを考慮し、
> Friend Sub OnRowHeaderCheckboxChanged()
の部分を Protected メソッドにしておいた方が良いのでは無いでしょうか。
Protected Friend Overridable Sub OnRowHeaderCheckboxChanged(e As DataGridViewRowEventArgs)

※Overridable にするかどうかは設計次第