• 締切済み

VBにおいてフォーム間の変数の引き渡しなど

初心者です。VB2010においてわからないことがあるので教えていただきたいです。よろしくお願いします。 メイン画面でデータ表示、サブ画面で条件を指定し、サブ画面において決定ボタンを押したらメイン画面のデータの絞り込みを行う。というような仕様のプログラムを組んでいるのですが、数点教えていただきたいです。 1、サブ画面のボタンが押されたら(Button1とする)、メイン画面を更新する、という動作を実現させたいのですが、どのように記述したらよいでしょうか?(メイン側に)。 サブ側は決定ボタンを押した時点で画面が閉じるように設定してあります。 2、サブ画面で決定ボタンを押したときに、メイン画面からその時点でのサブ側の変数を参照したいのですが、どのように参照したらいいでしょうか?(例えばサブ側のflag(integer型)の値を参照する、など) 以上です。申し訳ないですがよろしくお願いします。

みんなの回答

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.4

こちらが参考にならないでしょうか? http://www.oborodukiyo.info/Forms/VS2008/F-PassDataBetweenForms.aspx

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.3

もう少し、自分で調べる癖をつけたほうがいいですよ。 「VB.NET クラスプログラミング」、「変数のスコープ」、「フォーム操作」、「配列の変数の受け渡し」 このあたりは自習書やGoogle で調べればわかります。 http://hanatyan.sakura.ne.jp/dotnet/Sample.htm http://www.atmarkit.co.jp/fdotnet/dotnettips/index/index.html#i29 http://dobon.net/vb/dotnet/vb6/property.html

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

もう少し、自分で調べる癖をつけたほうがいいですよ。 「VB.NET クラスプログラミング」、「変数のスコープ」、「フォーム操作」、「配列の変数の受け渡し」 このあたりは自習書やGoogle で調べればわかります。 http://hanatyan.sakura.ne.jp/dotnet/Sample.htm http://www.atmarkit.co.jp/fdotnet/dotnettips/index/index.html#i29

回答No.1

※Windows Forms Application を想定しています。WPF であれば,ほぼ変わらない想定でいけると思います。 基本的には, ・やりとりするデータはクラスにまとめておき,アクセス用のプロパティを用意しておく _・データ表示ウィンドウ側で生成し,条件指定ウィンドウ側にコンストラクタやプロパティを通じてインスタンスを渡す _・条件指定ウィンドウ側では渡されたインスタンスとコントロールをデータバインドするか,イベントを通じてデータを同期させる ・データが決定された,または入力が取り消されたことは,メソッド呼び出しとイベントの機構を通じてやりとりする _・条件指定ウィンドウ側からはメソッドを呼び出すことでデータクラスに通知する _・データクラスは専用のイベントを発生させる _・データ表示ウィンドウ側はデータクラスのイベントのハンドラを通じて知る となります。 まぁ,モーダルウィンドウとして条件指定ウィンドウを表示しているのであれば, ShowDialogの戻り値を利用してデータが決定されたか取り消されたかを通知してもよいと思います。 で,ここまで疎にする必要が無い場合,条件指定ウィンドウに,アクセス用のプロパティを実装します。 上記のデータクラスを条件指定ウィンドウと一緒にしてしまった感じになります。 間違っても,条件指定ウィンドウのフィールドやコントロールにデータ表示ウィンドウから直接アクセスするような構造にしてはいけません。 # 慣れた人がわかった上でやるのは構わないけれども,自称でも初心者であるならば,基本に忠実であるべきかと。 1.に関しては,全部データバインドして,ボタンを押したタイミングでモデルのメソッドを呼び出すなりして,モデル全体に更新をかけてしまえば解決します。 ListViewやTreeViewなどのバインド不可のコントロールが入っている場合やデータバインドを利用していない場合などは, イベントをトリガにコントロールのデータを表示することになります。 先に書いた通り,ShowDialogの戻り値を使ってイベントのトリガの代わりにすることも可能です。 2.に関しては,そもそも参照対象の「サブ側の変数」をデータクラスに追い出したので,必要な値はデータクラスから取得できます。

関連するQ&A

  • 【VB】もっと簡単に書けないかな?

    お世話になっております。VB2005を最近かじりました。 フォーム上にボタンが100個ほど並んでいます。 グローバル変数としてboolean型のフラグを立てて、 ボタンを押したらボタンの色がピンクに、もう一度押したら元の色にという ごく簡単なプログラムを書きたいのですが、 1個のボタンごとに Private Flag as Boolean   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   Select Case Flag     Case False       Button1.BackColor = Color.Pink       Flag = True     Case True       Button1.BackColor = Color.FromKnownColor(KnownColor.ControlLight)       Flag = False     End Select   End Sub というプログラムを書くと100個同じようなプログラムを書かなくてはいけなくなり、大変手間がかかりメンテも大変です。 もっと簡単にする方法があったら教えていただきたく存じます。

  • 変数にフォームからの入力値は入るのですが。

    変数にフォームからの入力値は入るのですが。 VBA初心者です。下記コードを書きました。 フォームからの入力値をレポート印刷しようとしています。 MSGBOXで内容を参照したところ、変数の内容は入っています。 入っているのですが、レポート上、項目が#Errorになってしまいます。 どこが悪いのでしょうか?。 お分かりになる方でおみえならご教授下さい。 Option Explicit '共通変数の宣言 Dim stdocname As String Dim repo As Report Dim delt As String Dim kmsg As String        :        :        : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" Case "上段" & "3" stdocname = "レポート03上"        :        :        : Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select kmsg = MsgBox(joge & tuki & stdocname)

  • vb2010で2つのフォームを同時制御

    vb2010でプロジェクトを作成しています。 Form1がメインで、Form2を観客用に用意しています。 Form1のButton1をクリックすると、Form2のPictureBox1に画像を表示させたく、 下のようなプログラムを書いたのですが、Form2に画像が表示されないばかりか、 「オブジェクト参照がオブジェクトインスタンスに設定されていません。」というエラーまではかれてしまいます。このエラーの意味もわからないほど、素人なのでわかる方どうかよろしくお願いします。 ------------------------------------------------------------------------------ Private Sub Form1_Load Dim g As New Form2 g.Show() ------------------------------------------------------------------------------ Private Sub Button1_Click Form2.PictureBox1.Image = Image.FromFile("C/xxxxxxx.png") Form2.Refresh() ------------------------------------------------------------------------------

  • 変数にフォームからの入力値が入らない。

    変数にフォームからの入力値が入らない。 VBA初心者です。下記コードを書きました。 フォームからの入力値をレポート印刷しようとしています。 MSGBOXで内容を参照したところ、JOGEしか入っていませんでした。 どこが悪いのでしょうか?。 お分かりになる方でおみえならご教授下さい。 Option Explicit '共通変数の宣言 Dim stdocname As String Dim repo As Report Dim delt As String Dim kmsg As String        :        :        : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" Case "上段" & "3" stdocname = "レポート03上"        :        :        : Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select kmsg = MsgBox(joge, tuki, stdocname)

  • VBでの変数の扱い方?

    現在VBで電卓を作成中なのですが理解できない箇所があります。 一部引用させていただきます。 〔数値]+=と押したとき、[数値]の加算となる。例えば、10+=とキーを押したとき、20と表示される。ここで、等号(=)キーの前に押した演算キーを記憶しておく必要がある。演算の種類は、ボタンの配列の添字に合わせる。変数名はEnzanとし、Integer型でグローバル変数として宣言する。  また、演算の種類が0は加算、1は減算では覚えにくいので、定数として宣言しておく。 Dim Enzan As Integer '演算種類記憶用(+:0,-:1,*:2,/:3,4:=) Const NONE = -1 Const TASU = 0 Const HIKU = 1 Const KAKERU = 2 Const WARU = 3 Const EQU = 4 記憶しておく必要があることはわかったのですが、 なぜ、NONE = -1 に -1 を入れるのか TASU = 0 で=のあとに0をいれるのか 理解できません。 =を持ってくる必要があるのですか? =のあとの数字は適当な数字ですか? 大変申し訳ないのですが、回答まってます。

  • VB2013でのプログラム作成でつまづきました

    初めまして ご質問です 会社にて、職場改善のため VB2013でプログラムを作成していますが PCに詳しいのが自分しかいなく、指名されました。。。 もちろん自作PCとか作れるぐらいですが プログラムなんてやったことないし困っています 職場にプログラム専門の方がいるので教育を受けていますが 2.3回教えてもらって  「windowsの電卓を作ろう」と言われました 電卓作成は、初心者用の題材らしいですが とりあえず教えてもらった事を駆使し まずは、テキストボックスとテキストボックスに数字を入れ その二つを +や-ボタンを押し =ボタンを押すと、3つ目のテキストボックスに表示させるという 簡単なプログラムは、なんとかできましたが windowsぽくすると 例 11 + 12 - 9 とテキストに表示され =ボタンを押すと 表示が消え 計算結果が表示されます いまの問題 ・整数と文字列を表示させ、計算だけさせる ・変数宣言、IF、Serectしか教わってない(それだけでできる言われた笑) ・まだ、いまいちわかっていないため 詳しく知りたい 無論、教えてもらったコードをそのまま使いたいわけじゃなく どーいう流れで、どーいう風にというのを理解したいです 結局は自分が理解して、少しずつやらないといけないので 詳しい方、教えてください。 現在なにもできてないコードです ここにどう埋めるか教えてほしいです ------------------------------------------------------------------------------ Option Explicit On Public Class Form Public oboe As String '押されたボタンが数値以外を覚える変数 Public befor As String '押されたボタンが数値の場合 覚える変数 Public anser As Integer ' 計算結果を保存する 変数 Public number As Integer '入力された数値を保存する 変数 Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '1 befor = "1" ans.Text &= "1" End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '2 befor = "2" ans.Text &= "2" End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '3 befor = "3" ans.Text &= "3" End Sub Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 'たし算 oboe = "+" ans.Text &= "+" number = befor + ans.Text End Sub Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click '掛け算 End Sub Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click '計算 End Sub Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click 'CLEAR End Sub Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click '引き算 End Sub Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click '割り算 End Sub Private Sub ans_TextChanged(sender As Object, e As EventArgs) Handles ans.TextChanged

  • VB2010 クリック数カウント

    アンケート結果の集計のために、コマンドボタンをクリックするたび、ラベルのところにクリック数が表示されるプログラムを作ろうと思ってます VB2010ですが、下記のコードでは、クリックしたら「1」とだけしか表示されませんでした どうすれば、クリックの度、数が増えるのでしょうか? Private Sub Button1_Click() Handles Button1.Click Dim a As integer a = a + 1 Label1.Text = a End Sub

  • 「変数にフォームからの入力値は入るのですが2。」

    「変数にフォームからの入力値は入るのですが2。」 VBA初心者です。 以前のご回答ありがとうございます。 (1).画面を開き、条件を設定する。     →初期値設定ぐらいしかやっていません。 (2).レポートをデザインビューにし、レコードソースの所でクエリビルダを起動。 (3).クエリビルダでデータシートビューを開く     →クエリビルダまで行けるのですが、データシートビューを開くがありません。 (4).データシートビューに#Errorの欄があるようなら、クエリの     該当部分がオカシイので、クエリのSQLを提示してください。      (クエリビルダで、SQLビューを開くと表示される)     データシートビューが正常に表示されている場合は問題の     テキストボックスのコントロールソースを提示してください。     →データベースのクエリを見てもクエリは無いようです。      データシートビューは(レポート?)#Errorで表示されています。 ※.他の方が作られたものを修正している為、いまいち把握できていません。 Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Dim 月 As Long 月 = Val(tuki) If (joge = "上段" Or joge = "下段") & (月 >= 1 & 月 <= 12) Then stdocname = "レポート" & Format(月, "00") & Left(joge, 1) Else stdocname = "レポート原稿" End If kmsg = MsgBox(joge & tuki & stdocname) '*** stdocname(判定で指定されたレポート)を仮に開く DoCmd.OpenReport stdocname, acViewPreview '*** レポートのセット Set repo = Reports(stdocname) 上記、「型が一致しません」となってしまいました。 お分かりになる方でおみえならご教授下さい。

  • Vb2010

    vb2010です。 ログインフォーム(Form1)のログインボタン(button1)を押すとログインフォームは消え、メインフォーム(Form2)を表示するという事をしたいです。サンプルコードを教えて下さい。

  • Visual Basic 2005 Express Edition の「Button」

    今までVBやってはいたんですが、Microsoft Visual Basic 2005と今まで使っていたVBの違いに困っています・・・。 現在、「ボタンを押すたびにC(変数名)が増え、Cの内容をLabel1に表示」というごく基本的な命令すら書けないです。 Private Sub Button1_Click(略 Dim c As Integer c = c + 1 Label1.Text = c End Sub こう書いて、何度Button1をクリックしてもC(Labelに表示される)が最初の1回しか増えません。 何かもっと書かないといけないことがあるのでしょうか? どうか教えてください。お願いします!