0

私は現在、このスレッドHow can I handle ComboBox selected index changing?の2番目の応答をvb(新しいSelectedIndexChangingEventを導入するためにComboBoxをサブクラス化することを示唆する応答)に実装しようとしています。イベントハンドラvb.net Subclassing ComboBox - 取り消すことができるSelectedIndexChangingイベントを作成しようとしています

Private Sub MyComboBox1_SelectedIndexChanging(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles MyComboBox1.SelectedIndexChanging 
     MsgBox("Changing") 
End Sub 

は決してヒットしません。私は、selectedIndexChanging(小文字の最初の文字)変数を初期化する方法と関係があると考えています。何かご意見は?

Imports System.ComponentModel 

Public Class MyComboBox 
    Inherits ComboBox 

    Public Event SelectedIndexChanging as CancelEventHandler 
    Public LastAcceptedSelectedIndex As Integer 

    Public Sub New() 
     LastAcceptedSelectedIndex = -1 
    End Sub 

    Protected Sub OnSelectedIndexChanging(e As CancelEventArgs) 
     Dim selectedIndexChanging as CancelEventHandler = SelectedIndexChanging 
     If Not SelectedIndexChanging Is Nothing Then 
      selectedIndexChanging(Me, e) 
     End If 
    End Sub 

    Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs) 
     If LastAcceptedSelectedIndex <> SelectedIndex Then 
      Dim cancelEventArgs = New CancelEventArgs 
      OnSelectedIndexChanging(cancelEventArgs) 
      If Not cancelEventArgs.Cancel Then 
       LastAcceptedSelectedIndex = SelectedIndex 
       MyBase.OnSelectedIndexChanged(e) 
      Else 
       SelectedIndex = LastAcceptedSelectedIndex 
      End If 
     End If 
    End Sub 
End Class 

答えて

0

VBでは、C#とは少し異なるイベント宣言が処理されます。 VB RaiseEventキーワードは、 `OnSelectedIndexChanging 'メソッドのために翻訳しようとしたコードを効果的に生成します。

正しいVBの実装は次のようになります。

Protected Sub OnSelectedIndexChanging(e As CancelEventArgs) 
     RaiseEvent SelectedIndexChanging(Me, e) 
End Sub 

あなたは、VBはそれが本当のCancelEventHandler変数で作成し、隠れ変数を使用することにより、元のパターンをたどることができます。これらの隠し変数は、イベント名イベントの命名パターンに従います。したがって、実際のCancelEventHandler変数の名前はSelectedIndexChangingEventです。

Protected Sub OnSelectedIndexChanging(e As CancelEventArgs) 
     Dim selectedIndexChanging As CancelEventHandler = Me.SelectedIndexChangingEvent 

     If Not selectedIndexChanging Is Nothing Then 
      selectedIndexChanging(Me, e) 
     End If 
End Sub 
+0

素晴らしい知識のトークンTnTinMnに感謝します。あなたに最高です。 – user3613310

関連する問題