人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: kreuz2nd
●カテゴリ:コンピュータ
✍キーワード:ADD INDEX アイテム イベント クリック
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● cx20
●100ポイント

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

◎質問者からの返答

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

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

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


2 ● ngc02
●100ポイント

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ