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

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

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

Re[7]: 別フォームのコントロールのTextが変更できない


(過去ログ 73 を表示中)

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

■42605 / inTopicNo.1)  別フォームのコントロールのTextが変更できない
  
□投稿者/ ミク (1回)-(2009/10/19(Mon) 12:10:15)

分類:[.NET 全般] 

開発環境:Visual Basic 2008
使用言語:VB.net

初めて書き込みさせていただきます。
ミクと申します。
VB.netは初心者です。

現在、ShowDialog()メソッドを使用して呼び出したフォームから
呼び出し元のフォームのコントロールのTextプロパティを変更したいのですが、

呼び出し元フォーム名.コントロール名.Text="ABC"

とプログラムしても反映されず(呼び出し元のフォームのコントロールのTextが変わらない)困っています。


◆詳細状況を以下に示します。
フォームはA、B、Cの3つあります。
スタートアップフォームはフォームAです。

フォームAからShowDialog()でフォームBを呼び出しています。
更に、フォームBからShowDialog()でフォームCを呼び出しています。

このとき、フォームCからフォームBのコントロールのTextプロパティの変更ができません。

フォームBをスタートアップフォームにすると、
フォームCからフォームBのコントロールのTextプロパティを操作できました。

Show()メソッドでも試してみましたが、同様の状態で解決しませんでした。



どなたか、原因と解決方法を知っておられる方は、大変お手数ですがご教授のほどよろしくお願いいたします。







引用返信 編集キー/
■42606 / inTopicNo.2)  Re[1]: 別フォームのコントロールのTextが変更できない
□投稿者/ ヴァン (22回)-(2009/10/19(Mon) 12:21:31)
No42605 (ミク さん) に返信

症状が再現するミニマムコードを書いてください。
どんなコードなのか解らないとアドバイスも何も出来ませんよ。
引用返信 編集キー/
■42607 / inTopicNo.3)  Re[1]: 別フォームのコントロールのTextが変更できない
□投稿者/ かずき (47回)-(2009/10/19(Mon) 12:24:28)
かずき さんの Web サイト
> フォームAからShowDialog()でフォームBを呼び出しています。
この部分を詳しく教えて下さい。
多分

Dim f As New フォームB
f.ShowDialog()

みたいにしてるんじゃないですか?
フォーム名.プロパティ名でアクセスするときのフォームのインスタンスは暗黙的に
作られるインスタンスなので、Newしたフォームとは別物です。
多分、そのせいで変更されてないのではないでしょうか。


引用返信 編集キー/
■42674 / inTopicNo.4)  Re[2]: 別フォームのコントロールのTextが変更できない
□投稿者/ ミク (2回)-(2009/10/20(Tue) 09:32:01)
>症状が再現するミニマムコードを書いてください。
>どんなコードなのか解らないとアドバイスも何も出来ませんよ。

申し訳ありませんでした。
以下が症状が再現するミニマムコードです。


※各フォームには、ボタンとテキストボックスが1つずつ置かれています。

'フォームA(スタートアップフォーム)
Public Class FormA
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f As New FormB
        f.ShowDialog()
    End Sub
End Class


'フォームB
Public Class FormB
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f As New FormC
        f.ShowDialog()
    End Sub
End Class


'フォームC
Public Class FormC
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FormA.TextBox1.Text = "test"
        FormB.TextBox1.Text = "test"
    End Sub
End Class

実行してみたところ、スタートアップフォームのフォームAのテキストボックスは"test"と表示されましたが、
フォームBのテキストボックスは表示されませんでした。


ご覧の通り、かずきさんのおっしゃる通りのプログラムです。
フォーム名.プロパティ名でアクセスするときのフォームのインスタンスを明示的に作成するにはどうすればよいのでしょうか?

引用返信 編集キー/
■42683 / inTopicNo.5)  Re[3]: 別フォームのコントロールのTextが変更できない
□投稿者/ まさる (101回)-(2009/10/20(Tue) 10:44:12)
まさる さんの Web サイト
No42674 (ミク さん) に返信
> フォーム名.プロパティ名でアクセスするときのフォームのインスタンスを明示的に作成するにはどうすればよいのでしょうか?

まず、「フォーム名.プロパティ名」でアクセスするのをやめましょう。

そして次は、FormBにFormAのフィールドを用意し、コンストラクタで受け渡すようにします。

Public Class FormB
    Private _formA As FormA

    Public Sub New(ByVal form As FormA)
        _formA = form
    End Sub

    〜

End Class

あとは、FormBを作成する際のコンストラクタに、FormA自らを設定してやり、
FormBではFormA用のフィールド(_formA)を使ってFormAのTextBoxにアクセスすればOKです。

    ' FormBの表示
    Dim f As New FormB(Me)
    f.ShowDialog()

    とやって、FormBでFormAのTextBoxにアクセスするには、

    _formA.TextBox1.Text = "ほげほげ"

FormB→FormCも同じ方法でよいでしょう。

ただし、本当はFormAにTextBoxの値を設定するためのプロパティなりメソッドなりを用意して、
FormB、FormCではそのプロパティ、メソッドを呼び出す方がいいと思います。

引用返信 編集キー/
■42686 / inTopicNo.6)  Re[4]: 別フォームのコントロールのTextが変更できない
□投稿者/ ミク (4回)-(2009/10/20(Tue) 11:05:32)
先ほどのミニマムコードの

'フォームB
Public Class FormB
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f As New FormC
        f.ShowDialog()
    End Sub
End Class

'フォームC
Public Class FormC
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FormA.TextBox1.Text = "test"
        FormB.TextBox1.Text = "test"
    End Sub
End Class


を


'フォームB
Public Class FormB
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f As New FormC(Me)
        f.ShowDialog()
    End Sub
End Class

'フォームC
Public Class FormC
    Private _formB As FormB

    Public Sub New(ByVal form As FormB)
        _formB = form
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FormA.TextBox1.Text = "test"
        _formB.TextBox1.Text = "test"
    End Sub
End Class

というように、まさるさんに教えていただいたとおりにしてみたのですが、
コンストラクタの部分で

警告	1	
デザイナで生成された型 'WindowsApplication1.FormC' の 'Public Sub New(form As FormB)' は 
InitializeComponent メソッドを呼び出さなければなりません。

と警告が表示されてしまいます。


警告なので無視して実行してみるとフォームBからフォームCを表示させた時に正常にフォームCが表示されません。
ボタンもテキストボックスもない空のフォームが表示されてしまいます。


どうすればいいのでしょうか?

引用返信 編集キー/
■42688 / inTopicNo.7)  Re[5]: 別フォームのコントロールのTextが変更できない
□投稿者/ ミク (5回)-(2009/10/20(Tue) 11:20:17)
すみません。



'フォームC
Public Class FormC
    Private _formB As FormB

    Public Sub New(ByVal form As FormB)

        _formB = form
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FormA.TextBox1.Text = "test"
        _formB.TextBox1.Text = "test"
    End Sub
End Class

を

Public Class FormC
    Private _formB As FormB

    Public Sub New(ByVal form As FormB)
        InitializeComponent()
        _formB = form
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FormA.TextBox1.Text = "test"
        _formB.TextBox1.Text = "test"
    End Sub
End Class

というようにコンストラクタ内でInitializeComponent()を実行することで警告を消すことができました。



皆さんのおかげで疑問点もすべて解決することができました。
本当にありがとう御座いました。

       

解決済み
引用返信 編集キー/
■42703 / inTopicNo.8)  Re[6]: 別フォームのコントロールのTextが変更できない
□投稿者/ まさる (102回)-(2009/10/20(Tue) 13:49:10)
まさる さんの Web サイト
No42688 (ミク さん) に返信
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> FormA.TextBox1.Text = "test"
> _formB.TextBox1.Text = "test"
> End Sub
> End Class

FormAも同じように対応しておかないと、FormA以外をスタートアップフォームにした場合に正常に動作しなくなりますのでご注意ください。
引用返信 編集キー/
■42869 / inTopicNo.9)  Re[7]: 別フォームのコントロールのTextが変更できない
□投稿者/ ミク (6回)-(2009/10/22(Thu) 14:38:33)
何から何までありがとうございました。

おかげですべて解決できました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -