C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: TabControl上に配置したTextBox等の操作


(過去ログ 133 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■78690 / inTopicNo.1)  TabControl上に配置したTextBox等の操作
  
□投稿者/ greenband (1回)-(2016/02/09(Tue) 17:23:27)

分類:[VB.NET/VB2005 以降] 

始めてお世話になります。

環境はVisual Studio 2013、言語はVB2013です。

form上にTextBox1〜TextBox4とCheckBox1〜CheckBox4を配置して、
TextBox1に入力した文字列をTextBox2〜TextBox4に反映し、
CheckBox1のチェック状態をCheckBox2〜CheckBox4に反映したいのですが、

Form上に直接配置したTextBox、CheckBoxの場合は以下の記述で動作しましたが、TabControl上に配置した場合には
”NullReferenceExceptionはハンドルされませんでした”というエラーとなり実行できませんでした。

いろいろ調べてみたのですが私の実力では対処法が判らず困っています。
具体的のどのように記述したらよいのでしょうか?
ご教示よろしくお願いいたします。


Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged

	Dim i As Integer
	Dim Cname As String

	For i = 2 To 4
	    Cname = "CheckBox" & i.ToString
	    CType(Me.Controls(Cname), System.Windows.Forms.CheckBox).Checked = CheckBox1.CheckState
	Next

End Sub


Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged

	Dim i As Integer
	Dim Cname As String

	For i = 2 To 4
	    Cname = "TextBox" & i.ToString
	    CType(Me.Controls(Cname), System.Windows.Forms.TextBox).Text = TextBox1.Text
	Next

End Sub

引用返信 編集キー/
■78691 / inTopicNo.2)  Re[1]: TabControl上に配置したTextBox等の操作
□投稿者/ ジャジャ (1回)-(2016/02/09(Tue) 17:37:15)
2016/02/09(Tue) 17:38:25 編集(投稿者)

タブコントロールのようなコンテナ上にあるコントロールは、Me.Controls(名前)では取得できません。
Me.Controlsで取得出来るのはタブコントロールまでで、
そこからそのタブページのControls、でようやく目的のコントロールを取得できます。

この場合は、

Me.Controls.Find(Cname, True)

を使ってみてはどうでしょう。

Control.ControlCollection.Find メソッド
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.controlcollection.find.aspx
引用返信 編集キー/
■78700 / inTopicNo.3)  Re[2]: TabControl上に配置したTextBox等の操作
□投稿者/ shu (803回)-(2016/02/10(Wed) 15:24:54)
No78691 (ジャジャ さん) に返信

Controls.Findに頼るのも変な挙動をまねきかねないので
コントロールを配列化するなどして制御するコントロールを確実にした方がよいです。

Public Class Form1
    Private _TextBoxes() As TextBox
    Private _CheckBoxes() As CheckBox

    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        _TextBoxes = {TextBox2, TextBox3, TextBox4}
        _CheckBoxes = {CheckBox2, CheckBox3, CheckBox4}
    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As System.EventArgs) Handles TextBox1.TextChanged
        For Each txt In _TextBoxes
            txt.Text = TextBox1.Text
        Next
    End Sub

    Private Sub CheckBox1_CheckedChanged(sender As Object, e As System.EventArgs) Handles CheckBox1.CheckedChanged
        For Each chk In _CheckBoxes
            chk.Checked = CheckBox1.Checked
        Next
    End Sub
End Class

引用返信 編集キー/
■78812 / inTopicNo.4)  Re[3]: TabControl上に配置したTextBox等の操作
□投稿者/ greenband (2回)-(2016/02/18(Thu) 17:10:44)
No78700 (shu さん) に返信
No78691 (ジャジャ さん) に返信

ジャジャ さん,shu さん ご回答ありがとうございました。
この質問をした直後に病気のため入院してしまい、お礼を差し上げるのが遅くなってしまいました。申し訳ありませんでした。
今日退院して、内容を読ませていただきましたので参考にして少し考えてみます。
結果が出ましたら改めてご報告いたしたいと思いますのでよろしくお願いいたします。
引用返信 編集キー/
■78834 / inTopicNo.5)  Re[4]: TabControl上に配置したTextBox等の操作
□投稿者/ greenband (3回)-(2016/02/20(Sat) 13:25:42)
No78700 (shu さん) に返信
No78691 (ジャジャ さん) に返信

お二方にご教示いただいた方法をそれぞれ試し、動作することを確認いたしました。

shuさんのおっしゃる

>Controls.Findに頼るのも変な挙動をまねきかねないので
>コントロールを配列化するなどして制御するコントロールを確実にした方がよいです。

ということについては私の実力ではまだ十分に理解できていませんが、もう少し調べてみてどちらの方法をとるのかは実装の状況などにより判断したいと思います。
本当に助かりました。 ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -