VB2005Expressで、ContextMenu内のItemを動的に変更させたいと思い、ContextMenuStrip1.Items.Add()で記述だけは動的に変化させることができましたが、変化するItemに対するコードを記述しようとした途端にその方法がまったくわからないことに気づきました。


動的に変化するから、ビルドする前にそれぞれのItemのイベントを記述することはできないし、ComboBoxのようにIndexがあるなら、そしてMenuItemをクリックしたときにそのIndexが取得できるなら、それを用いてそれぞれのItemの実行コードがかけるのですが、クリックしたアイテムの名前はわかっても、Indexというものは無いようで・・・。

そこで、ContextMenuの動的に変化するItemのIndex(或いはIndexみたいなもの)を取得する方法・増減するItemに対するコードの記述方法をお教えいただけないでしょうか。どうしても知りたいので少し高ポイントを設定しておきます。よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

ポイント100pt

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

id:kreuz2nd

解答ありがとうございます。なるほど、スマートな方法はないのですね。

作成していただいたコードためさせていただきました。まさにIndexですねー。こういう方法もあるんですね。いまいち判らなかったAdd以外でのコントロール(?)の作成方法がわからなかったので、勉強させていただきます。

Indexは解決したので(その他解決方法もあると思いますが)あとはコードの記述方法でしょうか。

2006/02/12 20:39:33
id:ngc02 No.2

回答回数108ベストアンサー獲得回数2

ポイント100pt

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されます。

id:kreuz2nd

解答ありがとうございます。

なるほど!そういう方法でしたか。お答えいただいたコードをそのまま貼り付けてみたらIndex自分のスクリプトにつけたところ、For〜Nextの部分でエラーがおき、Forの部分を

For i As Integer = 0 To ContextMenuStrip1.Items.Count - 1

にして実行したところ無事起動しました。

おかげさまでなんとか望みの機能がつけられそうです。ありがとうございます。

一応これで疑問は解決しましたので、終了とさせていただきます。解答いただいた方々ありがとうございました。

2006/02/12 21:15:36

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません