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

フォーム名をDirectCastで動的に指定した場合の問題

環境/言語:[OS : Windows 7 / 言語 : Visual Basic .NET / .NET Framework : 2.0]
分類:[.NET]

【解決したい問題】

いつも大変参考にさせていただいております。
さて、汎用のヘルプフォームを作成するため、親フォームからヘルプフォーム(子フォーム?これは、リンクプロジェクトとして作成)を呼び出し、呼び出す条件(親フォーム名、ヘルプデータを入力したいコントロール種類、コントロール名など)をヘルプフォームへ渡し、ヘルプフォームで検索、確定した値を親フォームの該当コントロールへ入力する仕様を考えています。
そこで、フォーム名を動的に指定するため、
過去の発言
**********************************************************
題名: Re[1]: 生成するフォームクラス名を動的に指定したい
著者: 魔界の仮面弁士
URL: http://yaplog.jp/orator/archive/39
日時: 2004/12/14 20:21:29
ID: 8043

一部省略

Dim FormName As String = "WindowsApplication1.Form1"

Dim F As Form = DirectCast(Type.GetType(FormName).GetConstructor(New Type() {}).Invoke(Nothing), Form)

F.Show()
**********************************************************
を参考にさせていただき、次のようなプロジェクトを作成し実験しました。

プロジェクト名:WindowsApplication1
フォーム数:2
フォーム名:Form1 , Form2

Form1のコントロール:
System.Windows.Form.Button 1つ、名称:Button1
System.Windows.Form.TextBox 1つ、名称:TextBox1

Form1のコードはButton1クリックイベントのみ

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form2.Show()
End Sub

Form2のコントロール:
System.Windows.Form.Button 1つ、名称:Button1
System.Windows.Form.TextBox 1つ、名称:TextBox1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim FormName As String = "WindowsApplication1.Form1"
Dim F As Form = DirectCast(Type.GetType(FormName).GetConstructor(New Type() {}).Invoke(Nothing), Form)

Dim CTL As Control
For Each CTL In F.Controls
If CTL.GetType Is GetType(TextBox) Then
If CTL.Name = "TextBox1" Then
CTL.Text = "あああああああああ"
End If
End If
Next
End Sub

上記の条件で、Form1のButton1クリックイベントでForm2を起動し、
Form2のButton1クリックイベントで、Form1のTextBox1に"あああああああああ"の文字を入力させたいのですが、特にエラーは出ないのですが、文字が入力されません。

【解決するために何をしたか】

Form2のButton1クリックイベントを

Dim FormName As String = "WindowsApplication1.Form1"
Dim F As Form = DirectCast(Type.GetType(FormName).GetConstructor(New Type() {}).Invoke(Nothing), Form)
の部分を↓
Dim F As Form = WindowsApplication1.Form1
の様に変更し、
-------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim F As Form = WindowsApplication1.Form1
Dim CTL As Control
For Each CTL In F.Controls
If CTL.GetType Is GetType(TextBox) Then
If CTL.Name = "TextBox1" Then
CTL.Text = "あああああああああ"
End If
End If
Next
End Sub
-------------------------------------------------
としてやれば、Form1のTextBox1に"あああああああああ"が入力されます。
フォーム名をDirectCastにてForm型に変更するやり方だと、変数Fに直接WindowsApplication1.Form1を代入するのと何か違いがあるのでしょうか。
もしかしたら、初歩的な何かを見逃しているかもしれませんが、よろしくご教授いただけたらと思います。
■No30799に返信(Samさんの記事)

> Dim F As Form = DirectCast(Type.GetType(FormName).GetConstructor(New Type() {}).Invoke(Nothing), Form)
このFが新しくつくられたForm1であり表示中のForm1ではないから。


このような実装ならForm2でイベントを発生させ
Form1でそのイベントを受け取ってForm1側でTextBox1に設定すると良いです。

提示のようにForm2側で処理させるなら、Button1_Clickでの処理対象となるTextBoxをForm2をShowするときに渡すと良いでしょう。
2012/08/02(Thu) 13:46:17 編集(投稿者)

■No30800に返信(shuさんの記事)
> ■No30799に返信(Samさんの記事)
>
>>Dim F As Form = DirectCast(Type.GetType(FormName).GetConstructor(New Type() {}).Invoke(Nothing), Form)
> このFが新しくつくられたForm1であり表示中のForm1ではないから。
>
>
> このような実装ならForm2でイベントを発生させ
> Form1でそのイベントを受け取ってForm1側でTextBox1に設定すると良いです。
>
> 提示のようにForm2側で処理させるなら、Button1_Clickでの処理対象となるTextBoxをForm2をShowするときに渡すと良いでしょう。
>

早速のご教授、ありがとうございました。
やはり、Fが新規別フォームだったのですね。
親フォームで子フォームのイベントを受け取る方法でやってみます。
解決済み!

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