フォーム1の値をフォーム2のラベルに表示させるには?

解決


VBの特訓中  2005-12-04 23:58:56  No: 128543

はじめまして。
よろしくお願いいたします。
今、フォーム1でデータグリッドの表示項目を取得し、それを別のフォーム2のラベルに表示するように設定をかけたいと思っております。

記述としては下記のようにしています。(うまく表示できてません)
Private Sub DataGrid1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dtg1.MouseUp

 'データグリッドの現在のセルを取得
 Dim c As DataGridCell
'dtg1とはデータグリッドの事です。
 c = dtg1.CurrentCell

'グリッドの行を取得
Dim grn As Integer
grn = c.RowNumber

Dim g受診日1,g受診日2 As String

'grn行目の0列とgrn+1行目の0列をそれぞれg受診日1,g受診日2に代入
g受診日1 = CStr(dtg1(grn, 0))
g受診日2 = CStr(dtg1(grn + 1, 0))

MessageBox.Show("値を取得しているか確認" & g受診日1 & "" & g受診日2,"確認" )

'別のフォームのラベルへ表示させる
Dim frm経過 As New frm経過欄

frm経過.lbl1.Text = g受診日1 & "  " & gUser診療科名 & "  " & gUserID
frm経過.lbl2.Text = frm経過.lbl1.Text
frm経過.lbl3.Text = g受診日2 & "  " & gUser診療科名 & "  " & gUserID
frm経過.lbl4.Text = frm経過.lbl3.Text

End Sub

と記述しておりますが、メッセージボックスではデータグリッドのクリックされた行の値を取得・表示しております。
別のフォームへの記述方法をご教授いただきたく思っております。
よろしくお願いいたします。


KG  2005-12-05 02:20:19  No: 128544

frm経過欄というForm上のラベルにいれるならば
>Dim frm経過 As New frm経過欄
この宣言は削除していただいて

frm経過欄.lbl1.Text = g受診日1 & "  " & gUser診療科名 & "  " & gUserID
frm経過欄.lbl2.Text = frm経過.lbl1.Text
frm経過欄.lbl3.Text = g受診日2 & "  " & gUser診療科名 & "  " & gUserID
frm経過欄.lbl4.Text = frm経過.lbl3.Text

この記述じゃだめなのかしら。

#ラベルなのに.Textでいいんだろうか・・・|=_=;


VBの特訓中  2005-12-05 03:37:55  No: 128545

KGさん返答どうもです。

  KGさんのでやりましたら、
『非共有メンバを参照するにはオブジェクト参照が必要です』
と出てきました。

  ↑の解決策として
モジュール内に Dim frm経過 As  New frm経過欄

としてやってみましたが、エラーは消えましたが、表示はされませんでした。

  ラベルなのにTextってとこがおかしいのでしょうかね〜??


ねご  2005-12-05 08:34:34  No: 128546

非常に強引な方法ですが、
Form1で取得した値をすべてグローバル変数として宣言して
Form2の呼び出し時(Form2_Load)に自分でおのおのの
ラベルのテキストプロパティに値を代入してあげたらどうでしょうか?

つまり、
Form1側で
コードの一番最初(クラスの定義より前)に
Public g受診日1 as String
Public g受診日2 as String
Public gUser診療科名 as String

としてそのままコード。
Dim frm経過 As New frm経過欄
frm経過.show()

一方でfrm経過欄では
Load時に

lbl1.Text= Form1.g受診日1 & "  " & gUser診療科名 & "  " & gUserID
lbl2.Text= lbl1.Text
lbl3.Text= Form1.g受診日2 & "  " & gUser診療科名 & "  " & gUserID
lbl4.Text= lbl3.Text

として表示したら
一応表示されると思います。

というか、何もこんなことをしなくても、

(実際にソースを実行できないので
  非常に無責任な回答になりますが)
元ソースのまま

Dim frm経過 As New frm経過欄

frm経過.lbl1.Text = g受診日1 & "  " & gUser診療科名 & "  " & gUserID
frm経過.lbl2.Text = frm経過.lbl1.Text
frm経過.lbl3.Text = g受診日2 & "  " & gUser診療科名 & "  " & gUserID
frm経過.lbl4.Text = frm経過.lbl3.Text

'一応フォームを表示する命令を送ってみる。
frm経過.show()'ちょっと変更。
frm経過.Refresh()'ちょっと変更。

ではだめでしょうか?


特攻隊長まるるう  2005-12-05 19:37:14  No: 128547

質問する場合は開発環境を書きましょう。

[VB.NET]ではオブジェクトの使い方をよく学んでおく必要があります。
オブジェクトを格納する変数を用意し、そこに New を使って実体を
格納してやります。この際、New は新しいインスタンスをメモリ上に
ロードします。
>モジュール内に Dim frm経過 As  New frm経過欄
>としてやってみましたが、エラーは消えましたが、表示はされませんでした。
モジュール内で New 、そして MouseDown イベントでも New しているなら、
メモリ上に frm経過欄は2つロードされています。また、MouseDown イベント
が起こるたびにメモリ上に別のフォームがロードされつづけます。
別の実体に設定しているなら表示される訳がありません。
ご注意ください。


VBの特訓中  2005-12-05 20:05:26  No: 128548

ねごさま、特攻隊長まるるうさま
ご教授ありがとうございます。
開発環境は[VB.NET]です。
下記に詳しくもう一度記載いたします。

MDIを用いて、Form2内にForm1を一緒に表示させます。

Form1(名称:frm受診歴)には
データグリッド(名称:dtg1)があり、

Form2(名称:frm経過欄)には
ラベル1(名称:lbl1)があります。

まず、モジュール内には
  Public g受診日1, g受診日2 As String
  Public grn As Integer
  Public c As DataGridCell
  Public frm経過 As New frm経過欄
を用意しました。
Form1(frm受診歴)には
Private Sub DataGrid1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dtg1.MouseUp

  '現在のセルを取得
   c = dtg1.CurrentCell
   'グリッドの氏名情報を取得
   grn = c.RowNumber

   g受診日1 = CStr(dtg1(grn, 0))
   g受診日2 = CStr(dtg1(grn + 1, 0))

  frm経過.lbl1.Text = g受診日1 & "  " & gUser診療科名 & "  " & gUserID
  frm経過.lbl2.Text = frm経過.lbl1.Text
  frm経過.lbl3.Text = g受診日2 & "  " & gUser診療科名 & "  " & gUserID
  frm経過.lbl4.Text = frm経過.lbl3.Text
End Sub

と記載して実行してみましたが、フォーム2のラベルへうまく表示できませんでした。
  考えている動作は、Form1のデータグリッドのセルをクリックしたら、そのデータを読み込みForm2のラベルに表示するという動作を考えて試行錯誤中です。

皆様から提案されましたプログラムを行いました。
frm経過.show()'ちょっと変更。
frm経過.Refresh()'ちょっと変更。
  を追加して実行したら上記の動作をしましたが、データグリッド内をクリックすると1回目のクリックでは新しいフォームとしてfrm経過欄を開き、2回目以降のクリックでは現在のフォームにデータ表示が出来ていました。

  このような事がなぜ起こるのか疑問です。
2回目以降も同じように新しいフォームが開かれるのでしたがわかりますが、なぜ1度目だけこのようになるのか、勉強不足でわからないと言う状態です。

皆様申し訳ありませんが、ご教授のほどよろしくお願いいたします。


AAA  2005-12-05 20:21:59  No: 128549

気になったので・・・

KGさんの指摘は間違いではないです。
>#ラベルなのに.Textでいいんだろうか・・・|=_=;
VB.NETではtextですが、VB6.0ではcaptionですから、
あの時点では開発環境が明記されていないので、
KGさんが間違えられても仕方ありません。
それにしても
>>ラベルなのにTextってとこがおかしいのでしょうかね〜??
・・・馬鹿にしてますか?

特攻隊長まるるうさんのおっしゃる通りです。
>質問する場合は開発環境を書きましょう。

字面は丁寧なのだけど何かが引っかかる・・・


特攻隊長まるるう  2005-12-05 21:12:23  No: 128550

>VBの特訓中さん
結局何が言いたいのか分からないんですが。
うまくいったんですか?いかなかったんですか?

うまくいった上で1回目にフォームがロードされて2回目以降に
既にロードされているフォームが使われるのが分からない
…ということで良いですか?

…なら、前半の説明は省いて
>モジュール内で New して MouseDown イベント内の New を
>削除しました。希望通りの動作をしました。
と言えば分かりますよ。あとはモジュールがどういうものか
ヘルプで調べて下さい。[VB.NET]の場合、合わせて Shared
というキーワードについても調べておいて下さい。同じ動きを
します。


VBの特訓中  2005-12-05 21:29:05  No: 128551

皆様、文面中の誤字・不適切な発言など申し訳ありませんでした。
AAA様、馬鹿にするようなつもりはけっして無かったのですが、改めて文章を見るとそのように受け止められますね。すみませんでした。

  わかりづらい表現等すみませんでした。
私自身どの部分がわからないかと言いますとと、
フォーム1で取得した値をフォーム2のラベルに記述するやり方がわかりません。

frm経過.show()'ちょっと変更。
frm経過.Refresh()'ちょっと変更。
を追加すると希望通りの動きはしましたが、これを記述すると1回目のクリックをしたした時に新しいフォームへ移動するという動作をなくしたい又は前のフォームを削除して新しいフォームのみを表示させたいです。


VBの特訓中  2005-12-05 21:29:56  No: 128552

すみません。まだ解決していないのに、解決ボタンをクリックしてしまいました。

  大変申し訳ありません。


特攻隊長まるるう  2005-12-05 22:11:06  No: 128553

細かいけど…質問文と内容が微妙にずれてるのが分かり辛い原因です。
>私自身どの部分がわからないかと言いますとと、
>フォーム1で取得した値をフォーム2のラベルに記述するやり方がわかりません。
記述はできてるんですよね?フォーム1をアクティブにする方法が
分かれば良いんでしょうか…しかし、もともと強引なコードですしねぇ。
ちょっと根本的に変更したいですが…。

ついでに言えばモジュールでフォームなどのオブジェクトを
New する処理はちゃんと終了処理を考えないと非表示の
オブジェクトが残る場合もあり、初心者にはお勧めしませんが。

それなりのコードを書ける知識がないと説明する量が多くなって
しまいます。ちょっと以下のサイトのサンプルを全て解析して
根本的な部分を勉強してもらえませんか?
[VBレスキュー(花ちゃん)  フォーム関連]
http://www.bcap.co.jp/hanafusa/dotnet/formflm.htm
[VBレスキュー(花ちゃん)  Top]
http://www.bcap.co.jp/hanafusa/


マグ  2005-12-05 22:56:33  No: 128554

値の変更は出来たのでしょうか?
出来ていないのならば、サンプルを下に記載しておきます。

[Form1]
Public MyForm As Form1
'Loadイベントに記載してください。
MyForm=me

[Form2]

Label1.Text=MyForm.Label1.Text

とするとForm1のLabel1のデータをForm2のLabel1に表示させることが出来るようになります。

>これを記述すると1回目のクリックをしたした時に新しいフォームへ移動するという動作をなくしたい又は前のフォームを削除して新しいフォームのみを表示させたいです。

これは、Form1の方でForm2が表示されているかどうかを判断させて、IF文で条件処理をさせたほうが無難かなっと思います。


VBの特訓中  2005-12-06 01:50:46  No: 128555

KGさま、特攻隊長まるるうさま、AAAさま、そしてマグさま
ご教授ありがとうございました。
希望道理の動作を無事行う事が出来ました。
VBレスキュー(花ちゃん)を参考に、プログラムを書き直して無事動作しました。

本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加