[2018/03/29] コンボボックスのItemsプロパティにクラスデータを設定する方法(コードと文字列をセットで設定) (No.42)
[2018/03/29] コンボボックスの基本的な使い方(項目に文字列のみを設定) (No.41)
[2018/03/27] テキストボックスの入力を数字のみにする方法 (No.37)
[2018/03/22] SerialPortコントロールの使い方 (No.28)
[2018/03/22] コントロールを配列で処理する方法 (No.27)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
「コンボボックスの基本的な使い方」の中で コンボボックスの項目のコレクションとしての Itemsプロパティに文字列を設定していますが、 この文字列の代わりにクラスのデータを設定する方法を示します。
クラス名を ComboItemとし表示文字列とコードを内部に持ったクラスを宣言します。
以下にソースを示します。ここで重要なのは、ToString()メソッドを宣言することで、 コンボボックスの選択時に文字列として表示されるのが、このメソッドの戻り値が使用されるためです。'''
''' コンボボックスのItemsに設定される、表示文字列とコードを持ったクラス ''' Public Class ComboItem 'コードデータ退避 Private mintCode As Integer '表示文字列データ退避 Private mstrText As String '''''' 文字列プロパティ ''' Public ReadOnly Property Text As String Get Return Me.mstrText End Get End Property '''''' コードプロパティ ''' Public ReadOnly Property Code As Integer Get Return Me.mintCode End Get End Property '''''' クラスデータの表示文字列を返す ''' '''表示文字列 '''ComboBoxの表示部分には、ToString()メソッドの内容が表示される Public Overrides Function ToString() As String Return mstrText End Function '''''' コンストラクタ ''' '''コード '''表示文字列 Public Sub New(ByVal intCode As Integer, ByVal strText As String) mintCode = intCode mstrText = strText End Sub End Classさてこのクラスを使用したコンボボックスへの設定ですが、以下のソースを見て下さい。
その後、フォームロードイベントでコンボボックスの Itemsプロパティ(ObjectCollection) に、4個クラスデータを生成し追加で初期化を行います。
ボタン1クリックイベントでは、 選択されているIndexの取得を行い、値が -1 で無ければ、 コンボボックスの選択値を取得し、クラスデータとしてキャストしたものから、コード及び文字列を取得し表示します。
ボタン2クリックイベントでは、コンボボックスの選択を解除します。
コンボボックスのItemsプロパティにクラスデータを設定する方法
Public Class frmComboBoxItemsClass ' ===== ' 実際はここに上のクラス宣言がある ' ===== '''
''' フォームロードイベント ''' Private Sub frmComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load 'コンボボックス初期化 With Me.ComboBox1 .DropDownStyle = ComboBoxStyle.DropDownList 'クラスを使用してコンボボックスへの設定 Dim cboItem As ComboItem cboItem = New ComboItem(10, "あいうえお") .Items.Add(cboItem) cboItem = New ComboItem(20, "かきくけこ") .Items.Add(cboItem) cboItem = New ComboItem(30, "さしすせそ") .Items.Add(cboItem) cboItem = New ComboItem(40, "たちつてと") .Items.Add(cboItem) End With End Sub '''''' ボタンクリックイベント・選択状態の表示 ''' Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '選択されているIndexの取得 Dim intIdx As Integer = Me.ComboBox1.SelectedIndex If intIdx <> -1 Then '選択されている項目の取得(クラスデータへのキャスト) Dim cboItem As ComboItem = CType(Me.ComboBox1.SelectedItem, ComboItem) '結果表示 Dim strDsp As String = "コード : " & cboItem.Code & vbCrLf & "文字列 : " & cboItem.Text MsgBox(strDsp, MsgBoxStyle.OkOnly, Me.Text) Else MsgBox("未選択!!", MsgBoxStyle.OkOnly, Me.Text) End If End Sub '''''' ボタンクリックイベント・選択状態の解除 ''' Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '選択されている状態を解除 Me.ComboBox1.SelectedIndex = -1 End Sub End Class
結果これを実行しますと、以下の様になります。
ボタン1のクリック時は以下の様になります。ボタン2のクリック時はコンボボックスの選択が解除され何も表示されないはずです。
尚、フォームロードイベントでのコンボボックスへの初期化ですが、 クラスデータの配列を宣言し、AddRangeを使って以下の様に書き換えることもできます。'''
''' フォームロードイベント ''' Private Sub frmComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load 'コンボボックス初期化 With Me.ComboBox1 .DropDownStyle = ComboBoxStyle.DropDownList Dim cboItems() As ComboItem = { New ComboItem(10, "あいうえお"), New ComboItem(20, "かきくけこ"), New ComboItem(30, "さしすせそ"), New ComboItem(40, "たちつてと") } .Items.AddRange(cboItems) End With End Sub関連する記事
⇒コンボボックスの基本的な使い方(項目に文字列のみを設定)
⇒ComboBoxの簡単な拡張クラス(枠線色の描画):[WndProc,CreateGraphics,DrawRectangle]
おすすめ本
PR -
コンボボックスの基本的な使い方として、コンボボックスの項目に文字列を設定し、 選択されている状態を取得する方法などを説明します。
フォーム上にコンボボックスを1個と、ボタンを2個貼り付けます。 その後、フォームロードイベントでコンボボックスの Itemsプロパティ(ObjectCollection) に各種文字列の追加で初期化を行います。
ボタン1クリックイベントでは、コンボボックスの選択値を取得し表示し、 ボタン2クリックイベントでは、コンボボックスの選択を解除します。コンボボックスの基本的な使い方
Public Class frmComboBox '''
''' フォームロードイベント ''' Private Sub frmComboBox_Load(sender As Object, e As EventArgs) Handles Me.Load 'コンボボックス初期化 With Me.ComboBox1 .DropDownStyle = ComboBoxStyle.DropDownList .Items.Add("あいうえお") 'ItemsはObjectのコレクション .Items.Add("かきくけこ") .Items.Add("さしすせそ") .Items.Add("たちつてと") .Items.Add("なにぬねの") .Items.Add("はひふへほ") .Items.Add("まみむめも") .Items.Add("やゆよ") End With End Sub '''''' ボタンクリックイベント・選択状態の表示 ''' Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '選択されているIndexの取得 Dim intIdx As Integer = Me.ComboBox1.SelectedIndex '選択されている文字列の取得 Dim strSel As String = CType(Me.ComboBox1.SelectedItem, String) '結果表示 Dim strDsp As String = "Index : " & intIdx.ToString & vbCrLf & "文字列 : " & strSel MsgBox(strDsp, MsgBoxStyle.OkOnly, Me.Text) End Sub '''''' ボタンクリックイベント・選択状態の解除 ''' Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '選択されている状態を解除 Me.ComboBox1.SelectedIndex = -1 End Sub End Class
結果これを実行しますと、以下の様になります。
ボタン1のクリック時は以下の様になります。ボタン2のクリック時はコンボボックスの選択が解除され何も表示されないはずです。
尚、選択されている項目Index(SelectedIndex)ですが、この値が -1 であることが 未選択状態を表しますので、 -1 の場合には何も処理をしない様にした方が良いと思います。関連する記事
⇒コンボボックスのItemsプロパティにクラスデータを設定する方法(コードと文字列をセットで設定)
⇒ComboBoxの簡単な拡張クラス(枠線色の描画):[WndProc,CreateGraphics,DrawRectangle]
おすすめ本
-
テキストボックスでの入力で、入力される文字を数字のみとしたい場合の方法を示します。
文字の入力を行うとテキストボックスの KeyPress イベントが発生します。 この時に入力された文字をチェックし、数字以外であればその文字を捨てる処理を行います。 尚、 KeyPress イベントでは BackSpaceキー入力の場合も発生しますので、 このキーは有効にする必要があります。KeyPress イベントで数字チェックを行う
Public Class frmTextBox Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress 'キーが [0]~[9] または [BackSpace] 以外の場合イベントをキャンセル If Not (("0"c <= e.KeyChar And e.KeyChar <= "9"c) Or e.KeyChar = ControlChars.Back) Then 'コントロールの既定の処理を省略する場合は true e.Handled = True End If End Sub Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown '[Delete] キーを無効にする場合 If e.KeyCode = Keys.Delete Then e.Handled = True End If End Sub End Class
BackSpaceキーなどの制御用のキーは、 KeyPress イベントが発生しません。 そのため、KeyDown イベントでキーコードによりそれぞれの処理を行います。
(上のプログラムでは、Deleteキーを無効にしています。)
KeyPress イベントの処理でほぼ良いのですが、一つ問題があります。 それは、クリップボードからのコピペを行う場合にはKeyPress イベントが発生しないので、 対応を行わないと数字以外でも貼り付けられてしまいます。
テキストボックスのイベントには、クリップボードからの貼り付け時のイベントが在りませんので、 テキストボックスの大元のウインドウ・メッセージ処理の中でそれを行う必要があります。
普通にテキストボックスをフォームに張り付ける場合には、 ウインドウ・メッセージ処理を変更することはできません。 テキストボックスを継承したクラスの中でウインドウ・メッセージ処理を オーバーライドすることで可能になります。
以下にそのテキストボックスを拡張したクラスのソースを示します。KeyPress イベントで数字チェックを行う
'''
''' 数字とバックスペース以外の入力を無効にしたTextBox ''' Public Class ClsNumTextBox Inherits TextBox 'クリップボード貼付メッセージ Const WM_PASTE As Integer = &H302 '''''' WndProc メソッド (override) ''' ''' <param name="m">メッセージ</param> Protected Overrides Sub WndProc(ByRef m As Message) Select Case m.Msg Case WM_PASTE Dim iDataObj As IDataObject = Clipboard.GetDataObject() 'クリップボードの中身があるか、かつ文字列に変換できるか?? If (iDataObj IsNot Nothing) And (iDataObj.GetDataPresent(DataFormats.Text) = True) Then '文字列に変換 Dim strClip As String = DirectCast(iDataObj.GetData(DataFormats.Text), String) '文字列が数字のみか調べる If Me.ChkClipString(strClip) = False Then 'エラーの場合はここで抜ける Return End If End If End Select 'メッセージのデフォルト処理を呼出す MyBase.WndProc(m) End Sub '''''' コンストラクタ ''' Public Sub New() MyBase.New() 'IMEを無効にする MyBase.ImeMode = ImeMode.Disable End Sub '''''' KeyPressイベントの処理 ''' Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs) MyBase.OnKeyPress(e) 'キーが [0]~[9] または [BackSpace] 以外の場合イベントをキャンセル If Not (("0"c <= e.KeyChar And e.KeyChar <= "9"c) Or e.KeyChar = ControlChars.Back) Then e.Handled = True End If End Sub '''''' 文字列のチェック関数 ''' ''' <param name="strClip">指定文字列</param> '''True:OK, False:NG Private Function ChkClipString(ByVal strClip As String) As Boolean ChkClipString = False If System.Text.RegularExpressions.Regex.IsMatch(strClip, "^[0-9]+$") Then Return True End If End Function End Classこのソースを別のファイルで作成し、一度コンパイルします。 そうすると、ツールボックスの中に ClsNumTextBox が現れますので、 以下の様にこれをフォーム上に貼り付けます。
結果これを実行しますと、以下の様になります。 クリップボードからの貼り付けで、数字以外は表示されないはずです。
関連する記事
⇒テキストボックスの入力を数字のみにする方法その2(電卓の様な入力)
⇒テキストボックス拡張クラスにプロパティを追加する方法
⇒フォーム上のコントロールで[Enter]キー押下で次のコントロールにフォーカス移動する
⇒フォーム上のコントロールのイベント処理の一括関連付け:[AddHandler,DirectCast]
⇒コントロールの同じイベント処理に複数の関連付けをテスト:[AddHandler,DirectCast]
⇒テキストボックスの Leave イベントでのエラー処理でフォーカス強制移動する方法について
-
最近では通信と言えば、BlueTooth, USBやネットでの通信が当たり前で、 シリアルポート(RS232C)を使って外部装置と通信することも少なくなりました。 しかし稀に外部装置との接続をシリアル通信(調歩同期)で行うこともありますので 今回はシリアルポートを使う方法を説明します。
SerialPortコントロールを使うには、フォーム上にツールボックスからSerialPortを選択し貼り付けます。 以下の図は、SerialPortコントロールを貼り付けた後の様子です。
MSDNの説明によれば以下の様になっています。(代表的なものを示しています。青色は今回使用しているものです。)SerialPort コントロール・について
<プロパティ> ・PortName :通信用のポートを取得または設定します。 このポートには、使用可能なすべての COM ポートが含まれますが、 これに限定されるわけではありません。 ・BaudRate :シリアル ボー レートを取得または設定します。 ・BytesToRead :受信バッファー内のデータのバイト数を取得します。 ・BytesToWrite:送信バッファー内のデータのバイト数を取得します。 ・CtsHolding :Clear To Send ラインの状態を取得します。 ・DsrHolding :DSR (Data Set Ready) シグナルの状態を取得します。 ・IsOpen :SerialPort オブジェクトの開いている状態または 閉じた状態を示す値を取得します。 ・Parity :パリティ チェック プロトコルを取得または設定します。 ・DtrEnable :シリアル通信中に、DTR (Data Terminal Ready)シグナルを 有効にする値を取得または設定します。 ・DataBits :バイトごとのデータ ビットの標準の長さを取得または設定します。 ・StopBits :バイトごとのストップ ビットの標準の数を取得または設定します。 ・ReadBufferSize:SerialPortの入力バッファーのサイズを取得または設定します。 ・ReadTimeout :読み取り操作が完了していないときに、 タイムアウトになるまでのミリ秒数を取得または設定します。 <メソッド> ・Close() :ポート接続を閉じ、IsOpenプロパティを false に設定し、 内部 Stream オブジェクトを破棄します。 ・Open() :新しいシリアル ポート接続を開きます。 ・Read(Byte(), Int32, Int32): SerialPort の入力バッファーから複数のバイトを読み取り、 読み取ったバイトを指定したオフセットでバイト配列に書き込みます。 ・ReadByte() :SerialPort の入力バッファーから、同期で 1 バイトを読み取ります。 ・Write(Byte(), Int32, Int32): バッファーのデータを使用して、指定したバイト数をシリアル ポートに書き込みます。 <イベント> ・DataReceived:SerialPort オブジェクトによって表される ポートを介してデータが受信されたことを示します。
今回のプログラムをテストするためには外部装置か、もう一台別のPCが必要になりますが、 そんなことをしなくてもデバッグができるソフト(ドライバ)が在ります。
com0com というドライバで、PC上に仮想シリアルポートを2個作成し、 その2個をループバックできる様に仮想的に接続できるという優れものです。 以下のリンク先でソフトをダウンロードしてインストールしてみて下さい。 (尚、もう一台のPCなどがあれば必要ありませんが)
⇒http://sourceforge.net/projects/com0com/
このドライバをインストールすると、私のPCではCOM7、COM8が追加で生成されました。
インストール後のPCの状況を以下の図に示します。
COM7側をテスト用送信プログラムとするのですが、 通信テスト用に以下のフリーソフトを使いました。
「のん」さんといわれる方が作成された「RS232Cテストツール」です。
以下のサイトにアクセスすれば、ダウンロードできます。
⇒http://nonsoft.la.coocan.jp/Download/Rs232cTool/index.html
この方はいろいろなフリーソフトを作成されている様です。使えるソフトが満載です。
インストール後の「RS232Cテストツール」を動作させている様子を以下に示します。
では実際のプログラムを以下に示しますので、説明します。
フォームにSerialPort、TextBox、Buttonを各1個ずつ貼り付けます。
フォームロードイベントでは、シリアルポートの設定を行い、ポートのオープン処理を行います。 ポートの設定は、ポート名「COM8」、通信速度「9600BPS」、パリティ「無し」、データビット数「8」、 ストップビット「1Bit」です。
SerialPortの受信イベントにより、受信バッファー内のデータのバイト数分のバイト配列を宣言し SerialPortのReadコマンドで受信バイトを全て読込みます。
読込んだバイト配列を文字列に変換し、TextBoxに設定します。
プログラム的には出来ている様な感じがしますが、これをデバッグモードで実行してみます。SerialPortコントロールの使い方(最初)
Public Class frmSerial '''
''' フォームロードイベント ''' Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With SerialPort1 'シリアルポートの設定 .PortName = "COM8" 'ポート名 .BaudRate = 9600 '通信速度指定 .Parity = IO.Ports.Parity.None 'パリティ指定 .DataBits = 8 'ビット数指定 .StopBits = IO.Ports.StopBits.One 'ストップビット指定 'シリアルポートのオープン .Open() End With End Sub '''''' フォームクローズイベント ''' Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed 'シリアルポートのクローズ SerialPort1.Close() End Sub '''''' シリアルポート受信イベント ''' Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 'データ受信 Dim arrByte As Byte() = New Byte(SerialPort1.BytesToRead - 1) {} '受信バッファー内のデータのバイト数分 'SerialPort の入力バッファーからバイト数を読み取り SerialPort1.Read(arrByte, 0, arrByte.GetLength(0)) '受信バイト配列を文字列変換 Dim str As String = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(arrByte) 'テキストBOXに文字列表示関数 DisplayText(str) End Sub '''''' テキストBOXに文字列表示関数 ''' ''' <param name="strDisp">表示文字列</param> Private Sub DisplayText(ByVal strDisp As String) 'テキストBOXに文字列を追加 Me.TextBox1.Text &= strDisp End Sub '''''' [Clear]ボタン処理 ''' Private Sub btnClear_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnClear.Click Me.TextBox1.Text = "" End Sub End Classこのプログラムをデバッグモードで実行させて待機状態にして置き、 先ほどの「RS232Cテストツール」を実行し、送信TEXTにデータを設定し、送信します。 送信ボタン押下した時に、今回のプログラムのTextBoxにデータが表示されるはずですが 実際は以下の様なエラーが発生しました。
スレッド間のアクセスが起きてエラーが発生した様です。
そこで調べたところ、MSDNの説明によれば、
DataReceived イベントは、データが SerialPort オブジェクトから受信されたときにセカンダリ スレッドで発生します。 メインの Form または Control で要素を変更する必要がある場合は、 Invoke を使用して変更要求をポストバックします。これにより、適切なスレッドで処理が実行されるようになります。
とあります。結局、DataReceivedイベントは別スレッドなので、フォームのコントロールなどにアクセスする場合は Invoke等を使用しなさいとのことの様です。
プログラムを以下の様に書き換えました。SerialPortコントロールの使い方(正常処理)
Public Class frmSerial '''
''' フォームロードイベント ''' Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With SerialPort1 'シリアルポートの設定 .PortName = "COM8" 'ポート名 .BaudRate = 9600 '通信速度指定 .Parity = IO.Ports.Parity.None 'パリティ指定 .DataBits = 8 'ビット数指定 .StopBits = IO.Ports.StopBits.One 'ストップビット指定 'シリアルポートのオープン .Open() End With End Sub '''''' フォームクローズイベント ''' Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed 'シリアルポートのクローズ SerialPort1.Close() End Sub '''''' シリアルポート受信イベント ''' Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 'データ受信 Dim arrByte As Byte() = New Byte(SerialPort1.BytesToRead - 1) {} '受信バッファー内のデータのバイト数分 'SerialPort の入力バッファーからバイト数を読み取り SerialPort1.Read(arrByte, 0, arrByte.GetLength(0)) 'デリゲート生成 Dim dlg As New DisplayTextDelegate(AddressOf DisplayText) '受信バイト配列を文字列変換 Dim str As String = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(arrByte) 'デリゲート関数をコールする Me.Invoke(dlg, New Object() {str}) End Sub 'Invokeメソッドで使用するデリゲート宣言 Delegate Sub DisplayTextDelegate(ByVal strDisp As String) '''''' テキストBOXに文字列表示関数 ''' ''' <param name="strDisp">表示文字列</param> Private Sub DisplayText(ByVal strDisp As String) 'テキストBOXに文字列を追加 Me.TextBox1.Text &= strDisp End Sub '''''' [Clear]ボタン処理 ''' Private Sub btnClear_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnClear.Click Me.TextBox1.Text = "" End Sub End Class
USB ⇒ RS232C 変換ケーブル
シリアル通信に関連してですが、 最近のPC、特にノートPCの場合ではRS232Cのコネクタがついていることは殆んどありません。
そのため、以下の様なUSBを使ったRS232Cの変換ケーブルが使えそうです。
⇒iBUFFALO USBシリアルケーブル(USBtypeA to D-sub9ピン)1.0m ブラックスケルトン BSUSRC0610BS
⇒サンワサプライ USB-RS232Cコンバータ USB-CVRS9
⇒Plugable USB‐9ピンRS232シリアルアダプター (Prolific社製 PL2303HX Rev Dチップセット採用)
関連する記事
⇒SerialPortコントロールの使い方その2
⇒SerialPortコントロールの使い方その3(外部装置からの垂れ流しデータ受信)
⇒SerialPortコントロールの使い方その4(データ受信時にイベントを発生させる)
⇒SerialPortコントロールの使い方その5(データ受信時及び、信号変化時にイベントを発生させる)
⇒SerialPortコントロールの使い方その6(ハンドシェィクによるデータ送受信)
おすすめ本
-
フォーム上にある同じ種類のコントロールを配列に入れて、 昔のVisualBasicの様にコントロール配列的に処理したいことはよくあります。 そこで今回は、フォーム上に設置した5個の TextBox と Button を配列に入れて処理を行う方法を示します。
以下の画像は、今回のフォームを実行した場合の表示で、Button4 を押下した時の様子です。
以下のソースは、フォームロード時に「コントロール配列」に TextBox1~5 及び Button1~5 を設定し 各ボタンのクリックイベントの処理関数を AddHandler で設定しています。
ボタンのクリックイベントではイベント発生が在ったオブジェクト sender がどのボタンに該当するのかの 配列の指標を取得します。 その指標を使って、TextBox と Button のプロパティにアクセスし、そのデータを表示しています。コントロールを配列で処理する方法
Public Class frmCtrlIdx 'TextBoxコントロールの配列 Private ArrTextBox() As TextBox 'Buttonコントロールの配列 Private ArrButton() As Button '''
''' フォームロードイベント ''' Private Sub frmCtrlIdx_Load(sender As Object, e As EventArgs) Handles Me.Load 'コントロール配列に各コントロールを設定 ArrTextBox = {Me.TextBox1, Me.TextBox2, Me.TextBox3, Me.TextBox4, Me.TextBox5} ArrButton = {Me.Button1, Me.Button2, Me.Button3, Me.Button4, Me.Button5} 'ボタンコントロールのクリックイベント処理を定義 For Each btn As Button In ArrButton AddHandler btn.Click, AddressOf ButtonClick Next End Sub '''''' ボタンクリックイベント ''' Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs) For i As Integer = 0 To UBound(ArrButton) 'ボタンがどのボタンに該当するかチェック(指標を取得する) If sender Is ArrButton(i) Then 'テキストボックスの入力値を取得 Dim strTextBox As String = ArrTextBox(i).Text 'ボタンのCaptionを取得 Dim strTitle As String = DirectCast(sender, Button).Text '表示 MsgBox(strTextBox, MsgBoxStyle.OkOnly, strTitle) End If Next End Sub '''''' フォームClosedイベント ''' Private Sub frmCtrlIdx_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed 'コントロール配列の廃棄 Erase ArrButton Erase ArrTextBox End Sub End Class上の方法では、クリックイベントで sender がどのボタンに該当するかをコントロールを配列から探していますが、 ボタンのコントロール名の最後の数字と、テキストボックスのコントロール名の最後の数字が同じものにしていますので、 テキストボックスのコントロール名をフォーム上から探すことで同じことができます。
フォーム上に存在するコントロールを名前で探すには ControlCollection.Find メソッドを使用します。
以下にクリックイベントの部分のソースを示します。フォーム上のコントロールを名前で探す方法
'''
''' ボタンクリックイベント ''' Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs) 'ボタンのオブジェクト名から指標文字列を取得(Nameが[ButtonNN]の形式が前提) Dim strTitleIdx As String = DirectCast(sender, Button).Name.Replace("Button", "") '指標が数値?? If IsNumeric(strTitleIdx) = True Then 'テキストボックスのオブジェクト名 Dim strTextBoxName As String = "TextBox" & strTitleIdx 'フォーム上のテキストボックスを探す(結果が配列で返ってくる) Dim arrCtrl() As Control = Me.Controls.Find(strTextBoxName, False) If arrCtrl.Length > 0 Then 'テキストボックスの入力値を取得 Dim strTextBox As String = DirectCast(arrCtrl(0), TextBox).Text 'ボタンのCaptionを取得 Dim strTitle As String = DirectCast(sender, Button).Text '表示 MsgBox(strTextBox, MsgBoxStyle.OkOnly, strTitle) End If End If End Sub関連する記事
⇒コレクション「List」をコントロール配列の様に使う方法
⇒フォーム上のコントロールのイベント処理の一括関連付け:[AddHandler,DirectCast]
⇒コントロールの同じイベント処理に複数の関連付けをテスト:[AddHandler,DirectCast]
⇒配列の使い方について(Dim, Redim)
⇒配列の使い方の注意点について(コピー, Clone)
⇒配列の範囲指定によるコピー(Array.Copy, Skip, Take)