コントロール配列

解決


女伊達ら  2007-11-12 09:39:33  No: 138088  IP: 192.*.*.*

WindowsXP VB2005 の環境です。

オプションボタン3つの配列がVB6からのコンバートで
  optMode As Microsoft.VisualBasic.Compatibility.VB6.RadioButtonArray
  _op_1 as System.Windows.Forms.RadioButton
  _op_2 as System.Windows.Forms.RadioButton
  _op_3 as System.Windows.Forms.RadioButton
があります。
VB2005にコンバート後、同じ動作をするものを
  optMode2 As Microsoft.VisualBasic.Compatibility.VB6.RadioButtonArray
  _op_1b as System.Windows.Forms.RadioButton
  _op_2b as System.Windows.Forms.RadioButton
  _op_3b as System.Windows.Forms.RadioButton
として用意しました。
このボタンが押されたときの動作として、


Private Sub optMode_CheckedChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles optMode.CheckedChanged, optMode2.CheckedChanged

を用意し、この中に


  Dim Index As Short = optMode.GetIndex(eventSender)

を設定してインデックス番号を取得しようとしています。
問題は、ある関数からこのoptMode_CheckedChangedをプログラム上で
呼び出す
  If intA = 1 Then
    loptMode = optMode
  Else
    loptMode = optMode2
  End If

  loptMode(intI).Checked = True
    
このプログラムがあります。(変数の定義はここでは省略)
このうち、loptMode = optModeから①へ来る時は問題ないのですが、
loptMode = optMode2から①へ来ると、②で

「オブジェクトはコントロール配列のメンバではありません」

というエラーが実行時に発生します。
このエラーの意味が上手く理解できていません。
具体的にどういったところに注目してミスやもれを探せばいいのでしょうか。
XXX.Designer.vbの中を見たりしていますが、optMode、optMode間での
違いがありません。

編集 削除
女伊達ら  2007-11-12 11:25:24  No: 138089  IP: 192.*.*.*

Handles optMode.CheckedChanged, optMode2.CheckedChanged

としても、

Dim Index As Short = optMode.GetIndex(eventSender)

とすれば、optMode2からきた場合、このエラーが出るのですね。
ちなみに(今からすれば当然なのですが)

Dim Index As Short = optMode2.GetIndex(eventSender)

とすれば、当然エラーはありません。

しかし、optMode_CheckedChanged  内で、optModeか、optMode2か
どちらからきているのかを判断する方法がないのでしょうか?

手前でワンクッションおいて、optMode2_CheckedChanged  を用意する
方法はありますが、それをしないで・・・

ご教授ください。

編集 削除
女伊達ら  2007-11-12 11:31:36  No: 138090  IP: 192.*.*.*

目的は、判断した後、Index番号と、そのボタンの背景色を変えたいのです。

たとえば、

    optMode(Index).BackColor = Color.Black

です。(これだとoptModeが変わっちゃいますが、optMode2が押されたら
optMode2を変えたいのです)

編集 削除
特攻隊長まるるう  2007-11-12 11:55:09  No: 138091  IP: 192.*.*.*

>しかし、optMode_CheckedChanged  内で、optModeか、optMode2か
>どちらからきているのかを判断する方法がないのでしょうか?
引数の eventSender がイベントを起こしたオブジェクトの参照と
なっていると思います。TypeOf でデータ型を判定してみては?

# それ以前に、コンバートされたコードをそのまま使うのではなくて、
# 自分で RadioButton の配列を用意して作り直したほうが、後々
# 融通が利いて良いと思いますが。

編集 削除
特攻隊長まるるう  2007-11-12 11:57:21  No: 138092  IP: 192.*.*.*

> TypeOf でデータ型を判定してみては?
あ、ごめ。間違い。同じ型だった(汗)
Name で判定になるのかな?。

編集 削除
女伊達ら  2007-11-12 13:07:38  No: 138093  IP: 192.*.*.*

特攻隊長まるるう様
ご回答ありがとうございます。

これをやってみたのですが、eventSenderはボタンそのものになっており、
配列のどちらか(optModeかoptMode2か)ではなく、_op_1などの情報に
なっています。

どちらの配列から来ているのかがわかりません。
言葉足らずですみません。

編集 削除
特攻隊長まるるう  2007-11-12 13:37:19  No: 138094  IP: 192.*.*.*

>eventSenderはボタンそのものになっており、
なるほど。コントロール配列が廃止になったので、そうやって他のイベント
と歩調を合わせてあるんでしょう。
仕組み(概念)自体が無いので、自分で作るしかないと思います。

>どちらの配列から来ているのかがわかりません。
サンプル通りにコントロールの名前に規則性があるなら、『b』で終わって
いれば optMode2 なのでは?

編集 削除
女伊達ら  2007-11-12 13:58:46  No: 138095  IP: 192.*.*.*

特攻隊長まるるう様

そうですね、仕組みがなく、言わば無理やりなので、自分でワンクッション
置く方法にするか、ご指摘くださった名前での判断ですね。
ワンクッション置くとわかりづらくなるので、ご指摘頂いた方法で
対応させて頂きます。

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

編集 削除