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

VB2008について質問です。

分類:[.NET]

追加、削除ボタンを押すとlabel1と2、textbox1と2を一つのグループとして追加、削除できるようにしたいのですがイベントハンドラのところがうまくいきません。

どのようにすればよいのかどなたか助けていただけないでしょうか??

Public Class Form1
Private intCtrlCnt As Integer
'追加したコントロールのカウンタ
Private lblTitle(,) As System.Windows.Forms.Label
'動的に配置するラベルの配列 (i,j)
Private txtInput(,) As System.Windows.Forms.TextBox
'動的に配置するテキストボックスの配列 (i,j)

#Region "フォームロードイベント"
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'コントロールのカウンタ初期化
intCtrlCnt = 0

'コントロールを1グループ追加
Call AddControlGroup()

End Sub
#End Region

#Region "コントロール追加ボタンのクリックイベント"
Private Sub ButtonAddCtrl_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs _ ) Handles ButtonAddCtrl.Click
'コントロールを1グループ追加
Call AddControlGroup()
End Sub
#End Region

#Region "コントロール削除ボタンのクリックイベント"
Private Sub ButtonDeleteCtrl_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs _ ) Handles ButtonDeleteCtrl.Click
'コントロールを1グループ削除
Call DeleteControlGroup()
End Sub
#End Region

#Region "コントロールグループを追加するメソッド"
Private Sub AddControlGroup()
Dim intTabIndex As Integer
'タブインデックス
Dim intGroupTopLocation As Integer
'コントロールグループの位置 Top

Const LABEL_CTRL_NAME As String = "lblTitle"
'ラベルのコントロール名
Const TEXT_CTRL_NAME As String = "txtInput"
'テキストのコントロール名

Const LABEL_SIZE_WIDTH As Integer = 55
'ラベルサイズ Width
Const LABEL_SIZE_HEIGHT As Integer = 15
'ラベルサイズ Height
Const TEXT_SIZE_WIDTH As Integer = 160
'ラベルサイズ Width
Const TEXT_SIZE_HEIGHT As Integer = 20
'ラベルサイズ Height

Const LABEL_LOCATION_TOP As Integer = 24
'ラベルの位置 Top
Const LABEL_LOCATION_LEFT_A As Integer = 150
'ラベルAの位置 Left
Const LABEL_LOCATION_LEFT_B As Integer = 400
'ラベルBの位置 Left
Const CONTROL_LOCATION_INTERVAL As Integer = 35

'コントロールグループの配置間隔

Const CONTROL_MAX_NUM As Integer = 16
'コントロールの追加最大数

'コントロールが追加最大数を超える場合は処理しない
If (intCtrlCnt + 1) > CONTROL_MAX_NUM Then
MsgBox("これ以上の追加は無理", MsgBoxStyle.Information + MsgBoxStyle.OkOnly)
Exit Sub
End If

'コントロールカウンタ + 1
intCtrlCnt = intCtrlCnt + 1

'動的配列の再宣言
ReDim Preserve lblTitle(2, intCtrlCnt)
ReDim Preserve txtInput(2, intCtrlCnt)

'タブインデックスを算出する
intTabIndex = (intCtrlCnt - 1) * 4 + 1

'配置する高さの基準を算出
intGroupTopLocation = (intCtrlCnt - 1) * CONTROL_LOCATION_INTERVAL + 1

'ラベルAのインスタンスを生成する
Me.lblTitle(0, intCtrlCnt - 1) = New System.Windows.Forms.Label
'ラベルのプロパティ設定
With Me.lblTitle(0, intCtrlCnt - 1)
.Name = LABEL_CTRL_NAME & "A" 'コントロール名
.Text = "項目A-" & intCtrlCnt & ":" '



.Size = New Size(LABEL_SIZE_WIDTH, LABEL_SIZE_HEIGHT)
'サイズ
.Location = New Point(LABEL_LOCATION_LEFT_A, LABEL_LOCATION_TOP + intGroupTopLocation) '

.TabIndex = intTabIndex 'タブインデックス
.BackColor = Color.LightBlue
'背景色
.Visible = True
.Enabled = True
End With
Me.Controls.Add(Me.lblTitle(0, intCtrlCnt - 1)) 'フォームにコントロール追加

'テキストAのインスタンスを生成する
Me.txtInput(0, intCtrlCnt - 1) = New System.Windows.Forms.TextBox
'テキストのプロパティ設定
With Me.txtInput(0, intCtrlCnt - 1)
.Name = TEXT_CTRL_NAME & "A"
'コントロール名
.Text = vbNullString
'テキスト
.Size = New Size(TEXT_SIZE_WIDTH, TEXT_SIZE_HEIGHT)
'サイズ
.Location = New Point(LABEL_LOCATION_LEFT_A + 60, _
LABEL_LOCATION_TOP - 4 + intGroupTopLocation) '

.TabIndex = intTabIndex + 1

'タブインデックス
.Visible = True
.Enabled = True
End With
Me.Controls.Add(Me.txtInput(0, intCtrlCnt - 1))
'フォームにコントロール追加
'ラベルBのインスタンスを生成する
Me.lblTitle(1, intCtrlCnt - 1) = New System.Windows.Forms.Label
'ラベルのプロパティ設定
With Me.lblTitle(1, intCtrlCnt - 1)
.Name = LABEL_CTRL_NAME & "B"
'コントロール名
.Text = "項目B-" & intCtrlCnt & ":"
'テキスト
.Size = New Size(LABEL_SIZE_WIDTH, LABEL_SIZE_HEIGHT)
'サイズ
.Location = New Point(LABEL_LOCATION_LEFT_B, _
LABEL_LOCATION_TOP + intGroupTopLocation)
'位置
.TabIndex = intTabIndex + 2
'タブインデックス
.BackColor = Color.LightPink
'背景色
.Visible = True
.Enabled = True
End With
Me.Controls.Add(Me.lblTitle(1, intCtrlCnt - 1))
'フォームにコントロール追加

'テキストBのインスタンスを生成する
Me.txtInput(1, intCtrlCnt - 1) = New System.Windows.Forms.TextBox
'テキストのプロパティ設定
With Me.txtInput(1, intCtrlCnt - 1)
.Name = TEXT_CTRL_NAME & "B"

'コントロール名
.Text = vbNullString
'テキスト
.Size = New Size(TEXT_SIZE_WIDTH, TEXT_SIZE_HEIGHT)
'サイズ
.Location = New Point(LABEL_LOCATION_LEFT_B + 60, _
LABEL_LOCATION_TOP - 4 + intGroupTopLocation)
'位置
.TabIndex = intTabIndex + 3
'タブインデックス
.Visible = True
.Enabled = True
End With
Me.Controls.Add(Me.txtInput(1, intCtrlCnt - 1))
'フォームにコントロール追加


'イベントハンドラの関連付けは??---------------------------
'AddHandler Me.txtInput(0, intCtrlCnt - 1).Click, _
' AddressOf Me.txtInput_Click
'AddHandler Me.txtInput(1, intCtrlCnt - 1).Click, _
' AddressOf Me.txtInput_Click

'-------------------------------------------------------------------
End Sub
#End Region

#Region "コントロールグループを削除するメソッド"
Private Sub DeleteControlGroup()
'コントロールグループが1つの場合
If intCtrlCnt <= 1 Then
'処理しない
Exit Sub
End If

'フォーム上からコントロールを削除
Me.Controls.Remove(Me.lblTitle(0, intCtrlCnt - 1))
Me.Controls.Remove(Me.lblTitle(1, intCtrlCnt - 1))
Me.Controls.Remove(Me.txtInput(0, intCtrlCnt - 1))
Me.Controls.Remove(Me.txtInput(1, intCtrlCnt - 1))

'コントロールカウンタ - 1
intCtrlCnt = intCtrlCnt - 1
'動的配列の再宣言
ReDim Preserve lblTitle(2, intCtrlCnt)
ReDim Preserve txtInput(2, intCtrlCnt)
End Sub
#End Region

End Class
デバッグ依頼でないのであれば、必要最低限のコードを提示したほうが良いです。

AddHandler Me.txtInput(0, intCtrlCnt - 1).Click, _
AddressOf Me.txtInput_Click

とありますが、何をしようとしているかを理解していますか?

AddHandler:ハンドラを追加します。
Me.txtInput(0, intCtrlCnt - 1).Click:テキストボックスをクリックすると
AddressOf:関数を呼びだします。
Me.txtInput_Click:txtInput_Clickという関数です。

で、ソースを拝見しますとtxtInput_Clickという関数が無いようですが・・・?

次はデリゲートに関しての質問が来ると予想w
■No27397に返信(sakiさんの記事)
> 追加、削除ボタンを押すとlabel1と2、textbox1と2を一つのグループとして追加、削除できるようにしたいのですがイベントハンドラのところがうまくいきません。
>
> どのようにすればよいのかどなたか助けていただけないでしょうか??

コントロールの配列を作成する
http://dobon.net/vb/dotnet/control/buttonarray.html

は参考になりませんでしたか?

sakiさんのご投稿は、タイトルのつけ方などの点から、「書き込みのルールについて」をお読みいただいていないように感じられます。もしお読みいただいていないのであれば、お読みいただけますように、お願いいたします。

書き込みのルールについて
http://dobon.net/vb/bbs/index.html

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