- PR -

VB.NETからC#のFormを継承した際のイベント処理

投稿者投稿内容
ブギウギ
会議室デビュー日: 2003/11/05
投稿数: 3
投稿日時: 2004-02-13 22:16
はじめまして。
VB.NETからC#で作成したFormを継承して、ボタンのクリックイベント処理を書こうとしたら、以下のビルドエラーが発生しました。

> C:\・・・\aaa.vb(48): HANDLES 句には、WithEvents 変数が必要です。


C#で作成したFormは、System.Windows.Formsから単純に派生したFormで
そのForm上にボタン(button1)が1つあるだけです。

そして、VB.NETのソースは自動生成されるままに次のようになっています。
===================================================================
Public Class Test
Inherits CSharp.Form

#Region " Windows フォーム デザイナで生成されたコード "



#End Region

Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click

End Sub
End Class
===================================================================

C#とVB.NETのイベントの仕組みに相違があるためでしょうか?
何か回避策があれば教えてください。

宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-14 08:43
 AddHandlerを使ってください。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-02-14 18:59
AddHandlerを使う方法以外に、
例えば、
Private WithEvents button1WithEvents As Button

といような変数を宣言しておき、
FormのLoadイベントで
button1WithEvents = button1
のように代入しておくことで、

Private Sub button1WithEvents _Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1WithEvents .Click

End Sub

のような形でイベントを処理することができます。
ブギウギ
会議室デビュー日: 2003/11/05
投稿数: 3
投稿日時: 2004-02-17 01:23
ご返答、ありがとうございます。

AddHandlerを使う場合でも、使わない場合でも継承元のイベントの指定が
必要になると思うのですが、
C#で作った継承元のフォーム上にあるボタンのClickイベントを
継承する側(VB.NET)で処理させるには、どう指定すればよいのでしょうか?

以下のようにやってみたのですが、Form上でのClickイベントは
受け取ることができましたが、同じForm上にあるボタンのClickイベントは
受け取ることができませんでした。

 AddHandler MyBase.Click, AddressOf button1_Click

おそらく、MyBase.Click が、FormのClickイベントであることはわかったのですが
ボタンのClickイベントはどう指定したらよいのでしょうか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-02-17 04:02
引用:

ブギウギさんの書き込み (2004-02-17 01:23) より:

 AddHandler MyBase.Click, AddressOf button1_Click

おそらく、MyBase.Click が、FormのClickイベントであることはわかったのですが
ボタンのClickイベントはどう指定したらよいのでしょうか?


.NET でのイベントの仕組みについてある程度勉強した方が良いと思います。

MyBaseはFormの派生クラスですから、MyBase.ClickというのはForm.Clickのことです。
# まあ、同名で定義してたりしてってのは置いといて。

ボタンは、MyBase(CSharp.Form)にbutton1というフィールドとして定義されているので、
ボタンのクリックイベントは、MyBase.button1.Clickになります。
といっても、派生クラスからは基底クラスのメンバを直接参照できるので、
単純にbutton1.Clickでも同じです。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2004-02-17 10:50
引用:

なちゃさんの書き込み (2004-02-17 04:02) より:

ボタンは、MyBase(CSharp.Form)にbutton1というフィールドとして定義されているので、
ボタンのクリックイベントは、MyBase.button1.Clickになります。
といっても、派生クラスからは基底クラスのメンバを直接参照できるので、
単純にbutton1.Clickでも同じです。



デフォルトだとコントロールを配置しただけの場合の可視性は、
VS.NETでVB.NETではFriend、C#ではprivateじゃありませんでしたっけ?

だとすると、CSharp.Formの実装時にプロパティウィンドウでbutton1の可視性を
protected internalあたりに変更しておかないと、
継承したクラスからはbutton1の操作はできないと思います。
ブギウギ
会議室デビュー日: 2003/11/05
投稿数: 3
投稿日時: 2004-02-18 20:34
以下の通りやってみたら、うまくいきました。
ありがとうございました!

 AddHandler MyBase.button1.Click, AddressOf button1_Click

このような継承元フォームがC#で、それをVB.NETから継承する場合に
今回のイベントの処理以外で留意する点等ありましたら
ご教授いただけないでしょうか?

宜しくお願いします。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-19 08:26
引用:

ブギウギさんの書き込み (2004-02-18 20:34) より:

このような継承元フォームがC#で、それをVB.NETから継承する場合に
今回のイベントの処理以外で留意する点等ありましたら
ご教授いただけないでしょうか?


 C#とVB.NETというより、オブジェクト指向における継承とか暗黙のアクセス限定子に対する知識不足、という感じがしますけど?目的のもの(イベント、プロパティ)がどこにあるのか、そこへたどり着くにはどういった書き方をしなければならないのか、それにアクセスする権限があるのか、そういうところの問題だったように思います。

スキルアップ/キャリアアップ(JOB@IT)