- PR -

遅延バインディングの回避

1
投稿者投稿内容
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2007-07-24 09:16
いつもお世話になっています。

コンテキストメニューで選択されたメニューをTagプロパティを使って、取得しようとしていますが、「遅延バインディングが使用できない」というエラーが発生しています。型変換が必要だと思うのですが、どこで行えばよいかわかりません。下記に具体的なコードを載せますので、お分かりになる方ご教授いただければと思います。

コード:
 
 Dim firstMenu As ToolStripMenuItem = New ToolStripMenuItem()
 firstMenu.Text = "テスト"
 firstMenu.Tag = 0
 context.Items.Add(firstMenu)

 Me.MGrdTELM.ContextMenuStrip = ContextMenuStrip1
 
 AddHandler firstMenu.Click, AddressOf itemClick

 For i As Integer = 0 To ContextMenuStrip1.Items.Count - 1
  ContextMenuStrip1.Items(i).Tag = i
Next

Sub itemClick(ByVal sender As Object, ByVal e As EventArgs)
   MsgBox(sender.Tag) ← 遅延バインディングエラーが発生。
End Sub

かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-07-24 09:22
引用:

モンジさんの書き込み (2007-07-24 09:16) より:

コード:
Sub itemClick(ByVal sender As Object, ByVal e As EventArgs)
   MsgBox(sender.Tag) ← 遅延バインディングエラーが発生。
End Sub




sender は何型で Tag は何型ですか?
デバック時にエラー箇所でブレークしてそれぞれの型を確認してみるといいと思います。
_________________
かるあ のメモスニペット
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-07-24 09:22
ソースファイルの最初に
Option Strict On
と書いてください。

あるいは、プロジェクトのプロパティのコンパイルの設定でOption StrictをOnにしてください。

何が問題なのか見えてきます。

[ メッセージ編集済み 編集者: 一郎 編集日時 2007-07-24 09:26 ]
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2007-07-24 09:46
かるあさん、一郎さん、レスありがとうございます。

お二人のアドバイス通り、ブレークして、注意深くコードを追って行きました。

Sub itemClick(ByVal sender As Object, ByVal e As EventArgs)の中身を
下記のように変えるとうまくできました。

ありがとうございました。

Dim MenuItem As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
Dim str$ = DirectCast(MenuItem.Tag, String)
MsgBox(str)
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-07-24 09:51
引用:

モンジさんの書き込み (2007-07-24 09:46) より:

コード:
 Dim MenuItem As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
 Dim str$ = DirectCast(MenuItem.Tag, String)




キャストする場所は間違っていないと思いますが。。。
String ?先ほどのサンプルコードを見る限り Tag には 1(Integer) が格納されているような気が。

Convert.ToInt32(MenuItem.Tag).ToString()
とかじゃないかな?
_________________
かるあ のメモスニペット
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-24 10:20
System.String と互換があるので大丈夫なわけですが、(チェックしないなら Tag.ToString() でも良い) 型というかデータの種類が重要ならば型チェック (その前に null チェック) をしてからキャストするなりして取得した方が良いと思います。 2.0 ならば TryCast 演算子ですね。(C# の as に相当)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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