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

タグの編集
投稿者 N88-BASIC  (社会人) 投稿日時 2019/2/5 12:05:09
Windows10 + Visual Studio 2017 にてプログラムを開発しております。
複数のコントロールを同じイベントで処理をしたいと考え、各コントロールの判別をTAGプロパティで行おうとしておりますが、Option Strict On 状態では”遅延バインディングを使用できません”となり、現状、Option Strict Off にて運用しています( On の状態で遅延バインディング以外のエラーをチェック後)

現在の処理の概要は

   item(i) = new checkbox <--- 意外な感じですが checkbox を使っています
       item(i).tag = i
       Me.Controls.Add(item(i))
       AddHandler item(i).MouseClick, AddressOf Item_Click

Private Sub Item_Click(sender as Object , e as EventArgs)

     Select Cint(sender.tag)           <--- ここで遅延バインディングのエラーとなります。
         case 0
         case 1
     End Select

End Sub

Option Strict On 条件下で遅延バインディングを回避する方法もしくは、イベント発生元を判断する方法をご教授いただければ幸いです。
投稿者 shu  (社会人) 投稿日時 2019/2/5 17:36:38
sender.tag
=> DirectCast(sender, CheckBox).tag

など

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/2/6 09:30:11
> AddHandler item(i).MouseClick, AddressOf Item_Click

MouseClick を使っているのは、意図的なものでしょうか。
CheckedChanged を使わないと、キーボードからの選択時に問題がありませんか?
(矢印キー等でカーソル移動して、Space キーで選択された場合など)


> item(i) = new checkbox <--- 意外な感じですが checkbox を使っています

上記の配列が
Private item() As CheckBox
で管理されているのなら、Tag プロパティに頼らずとも
Dim idx As Integer = Array.IndexOf(item, sender)
'Dim chk As CheckBox = item(idx) 
'Dim chk As CheckBox = DirectCast(sender, CheckBox) 
で処理できそうです。
投稿者 N88-BASIC  (社会人) 投稿日時 2019/2/6 10:59:27
 shu さま、ご回答ありがとうございます。

ご案内いただいた方法で無事解決いたしました。

今後ともよろしくお願いいたします。
投稿者 N88-BASIC  (社会人) 投稿日時 2019/2/6 11:30:18
魔界の仮面弁士 さま、ご連絡ありがとうございます。

>MouseClick を使っているのは、意図的なものでしょうか。

意図的に使用しております。対象チェックボックスの最初のクリックでチェックボックスを選択した状態とし、そのクリックボックス全体の背景色も変更して対象であることを表すだけで、最初のクリックでチェック状態の変更を抑制するためです(最初のクリックでチェック状態が変わらないようにするため)。選択したチェックボックスをもう一度クリックすることでチェック状態を変えるためです。処理目的は時刻表のようなもので目的の時間が近づくとチェックボックスの背景色を変更して注意を喚起します。また、チェックボックスは注意喚起でビープ音を鳴らすかどうかを制御するためです。

>Private item() As CheckBox

実際は item(n,m) as CheckBox とした2次元配列で処理しており、私の知識では2次元配列への対処は実現できておりません。TAGに数値をわりあてて使った方法なので一次元配列に変更して対応できると思いますが、現状では他の部分への影響を考えて SHU さんの方法で実現させていただきます。ただ、一次元配列で実現可能な処理を行うアプリも作成しておりますので導入させていただきたいと思います。

2次元配列にしたのは時刻表のイメージから考えると、上り、下りに分けたためです。

今後ともよろしくお願いいたします。