画面Aから画面Bをモーダルで開き、画面Bでボタン押下したとき、選択した値を画面Aのテキストボックスに表示したいのですが、うまく表示されません。VB.NETで開発を行っています。
よろしくおねがいします。ソースは以下です。
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
Dim f As GAMEN_A
f = New GAMEN_A
f.txtMaker.Text = txtMakerName.Text
Close()
End Sub
何かおかしいところはありますでしょうか??
> 何かおかしいところはありますでしょうか??
はい。おかしいところがあります。
> Dim f As GAMEN_A
> f = New GAMEN_A
> f.txtMaker.Text = txtMakerName.Text
画面Aの新しいインスタンスを生成してますので、
呼び出し側の、画面Aとは「別物」になることに注意してください。
画面Aとおっしゃっている Form を引数で渡すようにするか、
唯一のインスタンス変数を公開しておき、プロパティを通して渡すべきでしょう。
ちなみに、前者の方法は OOPを無視した仕様なのでお勧めしません。
後者の方法を使うべきでしょう。
返答ありがとうございます。
後者のやり方というのは
画面AでPublicの
dim f = New GAMEN_Aというインスタンス変数を宣言しておくということでしょうか?
やってみたのですがうまくいかないので、理解していないのだと思います><
「インスタンス変数を公開しておき、プロパティを通して渡す」
というのはどのようにするのでしょうか??><
> Dim f As GAMEN_A
> f = New GAMEN_A
> f.txtMaker.Text = txtMakerName.Text
2行目削ってそのままいけると思いますが・・・
> 2行目削ってそのままいけると思いますが・・・
オブジェクト指向言語では、インスタンス化できる Form クラスそのものを扱うことは概念的にNG。
VB6以前もそういう扱いをするPGのせいで、VBは未熟言語扱いを受けている。
(VB6でクラスを意識して組むと、VB.NETのアプグレも非常に問題なくできる)
# まあ、VB6はオブジェクト指向言語に分類されていませんから、しょうがないのですが...。
閑話休題。
エントリポイントでインスタンス化したもので、アクセスすればよいかと。
Friend fFormMain As FormMain
' エントリポイント
Friend Sub Main()
fFormMain = New FormMain()
Application.Run(fFormMain)
End Sub
このfFormMainに対して、
fFormMain.txtMaker.Text = txtMakerName.Text
とすれば一応は動く。
ただ、Formをクラスとして考えると、「txtMaker」というコントロールはPrivateとして隠蔽されているべき。
まあ、この辺りはVB.NETの Modfiersの初期値が、「Friend」だからしょうがないのですが。
(C#は両方ともにPrivateが初期値)
だから、
「プロパティを通して渡すべきでしょう」
という発言をしました。
# このあたりの説明は省くとしましょう。
ツイート | ![]() |