質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

6906閲覧

form1かform2のどちらかから変数をform3に受け渡したい

hanbee.com

総合スコア52

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/09/26 14:59

フォーム間の値の受け渡しをしたいのですが、当初はform1からform3へ変数を渡すことしか考えていませんでしたので、form1からモーダルフォームとしてform3を開く(つまりこれはform1がform3のオーナーフォームになるということですよね?)ことで解決しておりました。
ソースコードが以下です。

vb

1Public Class form1 2 'モーダルフォームとしてフォーム3を開く。受け渡すためにテキストボックス1にnameを入れておく 3 Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click 4 TextBox1.Text = name 5 Dim f As New form3 6 f.ShowDialog(Me) 7 f.Dispose() 8 End Sub 9End Class 10 11Public Class form3 12   'フォーム1のテキストボックスからnameを取得する 13 Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load 14 Dim str As String = CType(Me.Owner, form1).TextBox1.Text 15 End Sub 16End Class

しかし、今新たにform2を作り、同じくform2をform3のオーナーフォームにして値を受け渡そうと思っていたら、form3のオーナーフォームが2つになってしまったことが原因なのか、エラーがでるようになってしまいました。

vb

1'form1,2からform3の開き方は同じ 2 3Public Class form3 4   'if文でform1,2のどちらかからstrに値を渡す 5 Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load 6 Dim str As String = CType(Me.Owner, form1).TextBox1.Text 7 if str = "" then 8 str = CType(Me.Owner, form2).TextBox1.Text 9 End If 10 End Sub 11End Class

しかしこれではエラーが起きます
エラー文章は以下です。
「System.InvalidCastException: '型 'sumple.form2' のオブジェクトを型 'sumple.form1' にキャストできません。'」

エラー文章のようにform2からform1にキャストする気はないのですが、プログラムにはそう取られている?みたいだと思うのですが、解決策が分かる方教えていただけませんか?

Visual Studio 2019
バージョン:Windowsフォームアプリケーション
フレームワーク:.NET Framework4.7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/09/26 20:54 編集

> エラー文章のようにform2からform1にキャストする気はないのですが、 あなたが「そのつもりがない」としても、以下のコードがそのように記述されています。 > Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load > Dim str As String = CType(Me.Owner, form1).TextBox1.Text コンパイラは「お気持ち」を解釈してくれることはありません。 書いたとおりの内容を解釈します。
guest

回答2

0

ベストアンサー

エラー文章は以下です。

「System.InvalidCastException: '型 'sumple.form2' のオブジェクトを型 'sumple.form1' にキャストできません。'」
エラー文章のようにform2からform1にキャストする気はないのですが、プログラムにはそう取られている?みたいだと思うのですが、解決策が分かる方教えていただけませんか?

Ctype関数について正しく理解されていないようです。

任意の式を、指定されたデータ型、オブジェクト、構造体、クラス、またはインターフェイスに明示的に変換し、その結果を返します。

とありますが、これはキャストするだけで、Form2をForm1に作り替えてくれるわけではありません。
ですので、オーナーフォームにForm2を指定した場合、CType(Me.Owner, form1)は変換できずにエラーとなります。

与えられた変数の型が何なのか判定する場合はTypeOf演算子を使用します。

VBNET

1If TypeOf Me.Owner Is Form1 Then 2 MessageBox.Show("Form1") 3End If

ただ、Form3側でこのような形で判断してForm毎に値を取得するようなことを行うと、対象のFormが増えるたびにソースを修正しなくてはならなくなります。

ですので、Form3側にプロパティを用意して、Form1、Form2からそのプロパティにセットすべきかと思います。

VBNET

1Public Class form3 2 3 Public Property StrData As String 4 5 Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load 6 Dim str = Me.StrData 7 End Sub 8End Class

といった感じでForm3にプロパティを用意して

VBNET

1Dim f3 As New Form3 2f3.StrData = "TEST" 3f3.ShowDialog(Me)

といった感じで呼ぶ側がそのプロパティにセットするといった感じです。

投稿2020/09/27 02:08

YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanbee.com

2020/09/27 03:50

こんな簡単にできるとは! キャストのことは正直あまり良くわかっていませんが、どのネット記事を読んでも変数の受け渡しについては理解できなかったので、public propertyの使い方などを簡潔に教えていただけて嬉しかったです。
guest

0

たんにform2のインスタンスを渡してそこからアクセスすればいいだけです。
それができない理由がなにかあるんでしょうか。


「ファイルを開く」ダイアログボックスを表示する - .NET Tips (VB.NET,C#...)

VB.NET

1'OpenFileDialogクラスのインスタンスを作成 2Dim ofd As New OpenFileDialog() 3 4'はじめのファイル名を指定する 5'はじめに「ファイル名」で表示される文字列を指定する 6ofd.FileName = "default.html" 7'はじめに表示されるフォルダを指定する 8'指定しない(空の文字列)の時は、現在のディレクトリが表示される 9ofd.InitialDirectory = "C:\" 10'[ファイルの種類]に表示される選択肢を指定する 11'指定しないとすべてのファイルが表示される 12ofd.Filter = "HTMLファイル(*.html;*.htm)|*.html;*.htm|すべてのファイル(*.*)|*.*" 13'[ファイルの種類]ではじめに選択されるものを指定する 14'2番目の「すべてのファイル」が選択されているようにする 15ofd.FilterIndex = 2 16'タイトルを設定する 17ofd.Title = "開くファイルを選択してください" 18'ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする 19ofd.RestoreDirectory = True 20'存在しないファイルの名前が指定されたとき警告を表示する 21'デフォルトでTrueなので指定する必要はない 22ofd.CheckFileExists = True 23'存在しないパスが指定されたとき警告を表示する 24'デフォルトでTrueなので指定する必要はない 25ofd.CheckPathExists = True 26 27'ダイアログを表示する 28If ofd.ShowDialog() = DialogResult.OK Then 29 'OKボタンがクリックされたとき、選択されたファイル名を表示する 30 Console.WriteLine(ofd.FileName) 31End If

ここでは、ofd にOpenFileDialogというフォームのインスタンスを入れて、そのofdから、そのフォームの変数やプロパティにアクセスし、表示してます。

同じことを、form2やform3に対して行えばいいという話となります

#なんなら、form1のインスタンスを渡してやるというはなしに

投稿2020/09/26 22:32

編集2020/09/27 01:40
y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanbee.com

2020/09/27 01:20

回答ありがとうございます。 申し訳ありませんが、私は初心者なので、変数の受け渡しの基礎がわかっていません。 form2のインスタンスを渡してそこからアクセスする方法を教えていただけませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問