0

オブジェクトの 1 つでイベントを発生させ、ウィンドウ フォームの 1 つで処理するコードを書き込もうとしています。非常に単純に見えますが、コードを機能させることができません。プログラムは人物オブジェクトを作成し、人物の名前を設定し、さらにイベントを発生させますが、フォーム コードではイベントを処理しません。'event' と 'raiseevent' を含むクラス コードをメイン プログラムにコピーしましたが、まだ機能しません。何が問題なのかわかりませんが、助けていただければ幸いです。

コードは、VS Express 2012 IDE ソフトウェアを使用して VB.NET で記述されています。

Public Class clsPerson
  Private m_name As String
  Public Event personviewed()

  Public Property name() As String
    Get
      name = m_name
    End Get
    Set(value As String)
      m_name = value
    End Set
  End Property

  Public Sub personviewedmethod()
    RaiseEvent personviewed()
  End Sub
End Class

Public Class Form1
  Public WithEvents clsperson1 As clsPerson

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim clsperson1 As New clsPerson
    clsperson1.name = "PersonsName"
    clsperson1.personviewedmethod()
  End Sub

  Private Sub personviewed() Handles clsperson1.personviewed
    MessageBox.Show("***Event raised**")
  End Sub
End Class
4

2 に答える 2

1

オブジェクトを再宣言すると、オブジェクトは同じではなく、完全に初期化され、ハンドラーは意図したとおりに動作します。

Public Class Form1
Public WithEvents clsperson1 As New clsPerson

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
   'Dim clsperson1 As New clsPerson -do not re-declare the object
   clsperson1.name = "PersonsName"
   clsperson1.personviewedmethod()
 End Sub

 Private Sub personviewed() Handles clsperson1.personviewed
   MessageBox.Show("***Event raised**")
 End Sub
End Class
于 2013-03-22T20:18:44.273 に答える
1

オブジェクトをさまざまなボタンで何度も使用したいと思われるでしょう。前述のように、ユーザーを再宣言しているため、そのハンドラーを削除しています。将来、このクラスとそのイベントを動的に使用できるようにする場合は、 を使用AddHandlerしてイベント ハンドラーを新しいインスタンスにアタッチする必要があります。

だからあなたはこれを得る:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Dim clsperson1 As New clsPerson() 
       clsperson1.name = "PersonsName"
       AddHanlder clsperson1.personviewed, AddressOf personviewed
       clsperson1.personviewedmethod()
    End Sub

   Private Sub personviewed()
      MessageBox.Show("***Event raised**")
   End Sub
End Class

ボタンをクリックするたびにこのように宣言すると、新しい人物が作成され、そのイベントは他のすべての人物オブジェクトから独立して処理されます。

オブジェクトの宣言with eventsは少し永続的です。これは、アプリケーションの存続期間を通じて使用される予定であり、Intellisense を使用できるようにしたい場合に行います。

于 2013-03-22T20:36:06.950 に答える