DOBON.NET DOBON.NETプログラミング掲示板過去ログ

イベントハンドラでのコントロール名取得

環境/言語:[WindowsXP VB.NET ]
分類:[.NET]

はじめまして。
VB.NETは今回はじめて手かげます。VB6.0の頭があるのでとても苦労しています。

画面にテキストボックスを配列のように貼り(txtBox1,txtBox2・・・)
こちらで調べた「コントロールを名前で探す方法」で制御しています。
指定した名前のコントロールを探す事はできました。

が、どのテキストも似たような処理をするためイベントハンドラに
Private Sub txtBox_KeyDown(Byval sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles txtBox1.KeyDown, txtBox2.KeyDown・・・・
としています。
その際、このイベントの中でどのテキストボックスのイベントなのか、
コントロール名を取得したいのですが
どう記述したらいいのでしょうか?
もしかしたらすごく簡単だったりします?
> が、どのテキストも似たような処理をするためイベントハンドラに
> Private Sub txtBox_KeyDown(Byval sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
> Handles txtBox1.KeyDown, txtBox2.KeyDown・・・・
> としています。
> その際、このイベントの中でどのテキストボックスのイベントなのか、
> コントロール名を取得したいのですが

あえて名前を取得する必要は無いと思いますよ。
引数 sender が、ターゲットとなっている TextBox そのものですから。


そもそも名前は、
 Button1.Name = "TextBox1"
 Label1.Name = "TextBox1"
 Label2.Name = "TextBox1"
のように、実行時に変更したり、重複して付ける事もできるので、
識別子として使うには、少々頼りないかも。
> あえて名前を取得する必要は無いと思いますよ。
> 引数 sender が、ターゲットとなっている TextBox そのものですから。

ありがとうございます。
でも、今開発中のプログラムで、txtBox1の時はtxtBox2へ、txtBox2の時はtxtBox3へ・・・
という仕様があるのです。
ですから名前を取得できたら、全部のテキストボックスのイベントを作らなくても
制御できるなあと思いまして。
さらにボタンAを押すとtxtBox1〜txtBox9のクリア、ボタンBを押すとtxtBox10〜txtBox18のクリアという処理もあります。

ちなみにテキストボックスの数は45個あるのです。

> そもそも名前は、
>  Button1.Name = "TextBox1"
>  Label1.Name = "TextBox1"
>  Label2.Name = "TextBox1"
> のように、実行時に変更したり、重複して付ける事もできるので、
> 識別子として使うには、少々頼りないかも。

そうですか・・・・。
困りました・・・・。
識別子としてこれ!というものはありますか?
> でも、今開発中のプログラムで、txtBox1の時はtxtBox2へ、txtBox2の時はtxtBox3へ・・・
> という仕様があるのです。
それを KeyPress イベントで…ですか。もしかして、フォーカス移動でしょうか。
もしそうなら、SelectNextControl を使う事で、次の/前のTabIndex の
コントロールへのフォーカス移動を行えます。


> 識別子としてこれ!というものはありますか?
先に書いた、引数『sender』を使ってください。たとえば、
 If sender Is txtBox1 Then
とか。必要であれば、その Name プロパティも取得できます。


> さらにボタンAを押すとtxtBox1〜txtBox9のクリア
それらをあらかじめ、配列や ArrayList などに入れておくと、
For Each 等で処理しやすくなりますよ。
> もしかして、フォーカス移動でしょうか。
> もしそうなら、SelectNextControl を使う事で、次の/前のTabIndex の
> コントロールへのフォーカス移動を行えます。

ご指摘の通りです。
古いユーザーなので、EnterKeyでの移動をしたいらしいのです。
この件は SelectNextControl で解決できそうです。
ありがとうございます。


>>識別子としてこれ!というものはありますか?
> 先に書いた、引数『sender』を使ってください。たとえば、
>  If sender Is txtBox1 Then
> とか。必要であれば、その Name プロパティも取得できます。


Name プロパティはどのように取得するのでしょうか?
sender.***.*** ???
いろいろやってみているのですが、なかなか。

もしくは
こんなイメージでできたりしてもいいのですが・・・
Dim i as short
Dim obj as object

For i = 1 to 45
obj = COBJ("txtBox" & i)
If sender Is obj then
End If
Next

私、今一、オブジェクトとかわかってないですよね(T_T)


>>さらにボタンAを押すとtxtBox1〜txtBox9のクリア
> それらをあらかじめ、配列や ArrayList などに入れておくと、
> For Each 等で処理しやすくなりますよ。

そうですね。
ありがとうございます!
2006/04/07(Fri) 17:15:21 編集(投稿者)

お世話になります。

■No15253に返信(あいりさんの記事)
> こんなイメージでできたりしてもいいのですが・・・

じゃんぬさんのところが参考になるかと思います。
http://jeanne.wankuma.com/tips/form/findcontrol.html

でも、わざわざ名前で探さなくとも、
If sender Is Me.TextBox1 Then
...

でいいのでは。
> でも、わざわざ名前で探さなくとも、
> If sender Is Me.TextBox1 Then
> ...
>
> でいいのでは。

そのif文を45個書くのが、仕様変更があった時に大変だと思いまして。
> Name プロパティはどのように取得するのでしょうか?
> sender.***.*** ???
Option Strict Off モードなら、
 Dim S As String = sender.Name
Option Strict On モードなら、
 Dim S As String = DirectCast(sender, Control).Name
とか。


> obj = COBJ("txtBox" & i)
リフレクションやControlsの列挙などを行えば、それに近い事は可能ですが、
それを毎回、イベントのたびに行わせるというのはあまりお奨めしません。
やるにしても、一度だけにした方が良いでしょう。

たとえば、Form_Load などの処理で、それらを
 Private TextBoxes As New ArrayList()
などに登録しておいたとすれば、使う時には、
  'txtBox1〜45 の一括クリア
  For Each Txt As TextBox In TextBoxes
   Txt.Clear()
  Next
とか、
  'イベント引数の sender の判定
  If TextBoxes.Contains(sender) Then
   'sender が txtBox1〜45 の時の処理
   Dim T As TextBox = CType(sender, TextBox)
  Else
   'sender が それ以外のコントロールの時の処理
  End If
のような制御ができるようになりますよ。
ありがとうございます!解決しそうです!

今回初めて.NETの開発に入り、張り切っていたのですが
結構細かい所でちょこちょこつまづいています。
これからもいろいろ参考にさせていただいてがんばります。
ありがとうございました。
できました!!!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板