動的に変化するから、ビルドする前にそれぞれのItemのイベントを記述することはできないし、ComboBoxのようにIndexがあるなら、そしてMenuItemをクリックしたときにそのIndexが取得できるなら、それを用いてそれぞれのItemの実行コードがかけるのですが、クリックしたアイテムの名前はわかっても、Indexというものは無いようで・・・。
そこで、ContextMenuの動的に変化するItemのIndex(或いはIndexみたいなもの)を取得する方法・増減するItemに対するコードの記述方法をお教えいただけないでしょうか。どうしても知りたいので少し高ポイントを設定しておきます。よろしくお願いします。
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.to...
ToolStripItem.Tag プロパティ (System.Windows.Forms)
URL はダミーです。
VB2005Pro で試しました(VB2005Express では試していないのでもしかしたら違っているかも知れません。)
選択されたメニューのインデックスを取得するスマートな方法(プロパティ等)は無さそうです。
方法として、ContextMenuStrip.Items コレクションの各アイテム(ToolStripMenuItem)をループでたどり、
アイテムの Selected が True なものがあればクリックされたアイテムとして判断できるかと思います。
(このときのループカウンタがインデックスに相当します。)
また、別の方法として、メニューアイテム追加時に Tag(タグ)プロパティにインデックス値を
セットしておけば、それを使用できるかと思います。
以下、サンプルコードです。
はてな投稿時に一部記号が全角になっているかと思いますので使用される場合は、お手数ですが半角に直してください。
<メニューにアイテムを追加するサンプル>
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim newItem As ToolStripMenuItem = New ToolStripMenuItem
Dim strItemName As String
Dim nItemNo As Integer
nItemNo = ContextMenuStrip1.Items.Count + 1
strItemName = ”Item - ” & nItemNo.ToString()
newItem.Text = strItemName
newItem.Tag = nItemNo.ToString() ’ タグ名を設定
ContextMenuStrip1.Items.Add(newItem)
End Sub
<クリックされたメニューの「インデックス」を取得するサンプル>
Private Sub ContextMenuStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ContextMenuStrip1.ItemClicked
Dim strip As ContextMenuStrip
strip = sender
Dim item As ToolStripMenuItem
Dim nItemNo As Integer
Dim i As Integer
For i = 0 To strip.Items.Count - 1
item = strip.Items(i)
’ 選択されたアイテム=クリックされたアイテムとして条件判断する
If item.Selected Then
nItemNo = i + 1
MsgBox(”[Item - ” & nItemNo.ToString() & ”] is Selected!”)
End If
Next
End Sub
<クリックされたメニューの「タグ」を取得するサンプル>
Private Sub ContextMenuStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ContextMenuStrip1.ItemClicked
Dim item As ToolStripMenuItem
item = e.ClickedItem
’ タグ名で条件判断する
Select Case item.Tag
Case ”1”
MsgBox(”First”)
Case ”2”
MsgBox(”Second”)
Case ”3”
MsgBox(”Third”)
Case Else
MsgBox(”Other”)
End Select
End Sub
http://msdn2.microsoft.com/ja-jp/library/7taxzxka.aspx
AddHandler ステートメント
Add()で増やしたObjectにはAddHandlerでイベントをつけることが出来ます。
----先にイベントを作る----
Sub itemClick(ByVal sender As Object, ByVal e As EventArgs)
Msgbox(sender.Tag)
End Sub
----ItemをAddするときイベントをつける-----------
Dim itemA As ToolStripItem = ContextMenuStrip1.Items.Add(”pepp”)
AddHandler itemA.Click, AddressOf itemClick
For i As Integer = 0 To ContextMenuStrip1.Items.Count
ContextMenuStrip1.Items(i).Tag = i
Next
--------
こうするとToolStripItemをクリックするとIndexみたいなものの値がMsgboxされます。
解答ありがとうございます。
なるほど!そういう方法でしたか。お答えいただいたコードをそのまま貼り付けてみたらIndex自分のスクリプトにつけたところ、For〜Nextの部分でエラーがおき、Forの部分を
For i As Integer = 0 To ContextMenuStrip1.Items.Count - 1
にして実行したところ無事起動しました。
おかげさまでなんとか望みの機能がつけられそうです。ありがとうございます。
一応これで疑問は解決しましたので、終了とさせていただきます。解答いただいた方々ありがとうございました。
解答ありがとうございます。なるほど、スマートな方法はないのですね。
作成していただいたコードためさせていただきました。まさにIndexですねー。こういう方法もあるんですね。いまいち判らなかったAdd以外でのコントロール(?)の作成方法がわからなかったので、勉強させていただきます。
Indexは解決したので(その他解決方法もあると思いますが)あとはコードの記述方法でしょうか。