C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■91957 / 1階層)  ContextMenuStripで引数を渡す方法
□投稿者/ Hongliang (860回)-(2019/08/14(Wed) 22:57:41)
まず、New EventHandlerに渡すメソッドは、
Sub Method(ByVal sender As Object, ByVal e As EventArgs)
という形でなければなりません(メソッド名や引数名は任意です)。
参考:
https://docs.microsoft.com/ja-jp/dotnet/api/system.eventhandler?view=netframework-4.8

VBの場合、異なる引数を持つメソッドをもとにEventHandlerをNewしてもコンパイルできたりすることもありますが、
実行時例外になったりすることもあるのでできるかぎり上記ルールを守るべきです。

なので素朴には引数ごとにメソッドを書くことになるわけですが。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    Me.ContextMenuStrip1.Items.Add("Test1", Nothing, New EventHandler(AddressOf test1))
    Me.ContextMenuStrip1.Items.Add("Test2", Nothing, AddressOf test2) ' New EventHandlerは省略可
End Sub
Sub Test1(ByVal sender As Object, ByVal e As EventArgs)
    Test(1)
End Sub
Sub Test2(ByVal sender As Object, ByVal e As EventArgs)
    Test(2)
End Sub
Sub Test(ByVal x As Integer)
End Sub

VB10(Visual Studio 2010に搭載されたVB)で、ラムダ式というのを使うことができるようになりました。
// 厳密には、ラムダ式はVB9(VS2008)で使えるようになり、VB10でSubをラムダ式で使えるようになりました。
ラムダ式を使うと、以下のように記述できるようになります。

Me.ContextMenuStrip1.Items.Add("Test1", Nothing, Sub(sender, e) test(1))

Sub部分を省略なく記述すると、以下のようになります。
New EventHandler(Sub(ByVal sender As Object, ByVal e As EventArgs)
    test(1)
End Sub)

処理を1行で記述できる場合、Sub(...)に続けて記述することでEnd Subを省略できます。
New EventHandler(Sub(ByVal sender As Object, ByVal e As EventArgs) test(1))

EventHandlerは Sub(Object, EventArgs) を要求するので、第1引数はObject型、第2引数はEventArgsであるのが自明です。
そのため、
New EventHandler(Sub(ByVal sender, ByVal e) test(1))
と記述すればコンパイラはsenderがObject、eがEventArgsであると推論してくれます(型推論)。

New EventHandlerを省略できるのも、.Items.Addの第3引数がEventHandlerであるから、
第3引数に渡されたデリゲート(AddressOfとか、ラムダ式とか)がEventHandlerであると型推論してくれるからです。
Sub(ByVal sender, ByVal e) test(1)

最後に、ByValは既定の呼び出しなので省略でき、最終的にこうなります。
Sub(sender, e) test(1)

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←ContextMenuStripで引数を渡す方法 /CCCO →Re[2]: ContextMenuStripで引数を渡す方法 /CCCO
 
上記関連ツリー

ContextMenuStripで引数を渡す方法 / CCCO (19/08/14(Wed) 21:58) #91956
ContextMenuStripで引数を渡す方法 / Hongliang (19/08/14(Wed) 22:57) #91957 ←Now
  └ Re[2]: ContextMenuStripで引数を渡す方法 / CCCO (19/08/14(Wed) 23:07) #91958
    └ Re[3]: ContextMenuStripで引数を渡す方法 / Hongliang (19/08/14(Wed) 23:23) #91959
      └ Re[4]: ContextMenuStripで引数を渡す方法 / CCCO (19/08/15(Thu) 11:14) #91967 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信