- - PR -
Form1→(複数)Form2を開き、Form1から全Form2を閉じる
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-01-28 15:00
初めて投稿します。
初心者ですので基本的な質問だと思いますが、よろしくお願いいたします。 VB.NETにおいて、 Form1での検索結果において選択された行の再詳細情報をForm2にて表示します。 複数の再詳細情報を閲覧する必要があるため、 モードレスにて複数のForm2を開きますが、 別の検索が行われたときには、開いた全てのForm2を閉じる、 という動作にしたいのですが、どうすればよいのでしょうか。 ご教授の程お願いいたします。 [ メッセージ編集済み 編集者: domingo 編集日時 2006-01-28 15:02 ] | ||||
|
投稿日時: 2006-01-28 15:04
開いた Form2 の参照をArrayList等に保持しておいて閉じます。
_________________ 囚人のジレンマな日々 | ||||
|
投稿日時: 2006-01-28 19:59
呼び出している時点で Form1 は親になるので、Form1 で管理します。 開ける時に参照を入れて管理するだけです。 VB6 みたいに考えるのであれば以下のリンクがそのものかと思います。 Visual Basic .NET で Forms コレクションを作成する方法 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-02-13 19:37
囚人さん、じゃんぬめっとさん、ありがとうございました。
とはいえ、きっとお二方のご想像を超える初心者でして、 ArrayListや、じゃんぬめっとさんご提案の Visual Basic .NET で Forms コレクションを作成する方法 や、別スレにあったJittaさんの http://quick-tips.hp.infoseek.co.jp/vs.net/sample/index.html (VCの持ち合わせがなく、表示不可) などを試してみましたが、実のところいまだ解決に至っておりません。 囚人さんもじゃんぬめっとさんも、 『Form2の参照をForm1で管理する』 とおっしゃっていますが、その方法が良く分かりません。 分からないなりにまず試してみたコードは以下の通りです。 Form1の宣言部において Private frm2_(10) As Form2 Private arrylst As ArrayList Private intFrmNum As Integer Form2を開くコードを Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click frm2_(intFrmNum).Show() arrylst.Add(frm2_(intFrmNum)) intFrmNum = intFrmNum + 1 End Sub 閉じるコードを Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer For i = 0 To intFrmNum arrylst.Remove(frm2_(i)) Next End Sub としましたが、 (Closeの仕方がわかりませんでした) まずForm2を開こうとすると 『オブジェクト参照がオブジェクト インスタンスに設定されていません。』 というエラーになります。 というわけで、現在は力技(?)で Form1の宣言部において Private frm2_1 As New Form2 Private frm2_2 As New Form2 Private frm2_3 As New Form2 Private frm2_4 As New Form2 Private frm2_5 As New Form2 Form2を開くコードを Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Select Case intFrmDNum Case 0 frm2_1.Show() intFrmNum = intFrmNum + 1 Case 1 frm2_2.Show() intFrmNum = intFrmNum + 1 Case 2 frm2_3.Show() intFrmNum = intFrmNum + 1 Case 3 frm2_4.Show() intFrmNum = intFrmNum + 1 Case 4 frm2_5.Show() intFrmNum = intFrmNum + 1 Case Else MsgBox("同時表示は5画面までです。") End Select End Sub 閉じるコードを Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Select Case intFrmDNum Case 0 frm2_1.Close() Case 1 frm2_1.Close() frm2_2.Close() Case 2 frm2_1.Close() frm2_2.Close() frm2_3.Close() Case 3 frm2_1.Close() frm2_2.Close() frm2_3.Close() frm2_4.Close() Case 4 frm2_1.Close() frm2_2.Close() frm2_3.Close() frm2_4.Close() frm2_5.Close() End Select intFrmNum = 0 End Sub としています。 とりあえずは動きますが、全く醜いので、やはりお二方のおっしゃる 『Form2の参照をForm1で管理する』 を美しく実装したいと切に願う次第です。 大変お手数とは思いますが、よろしくご教授の程お願いいたします。 | ||||
|
投稿日時: 2006-02-13 20:08
なるほど、確かに"ご想像を超える初心者"のようですね。
初めはだれでもそうです。 で、ソースですが参考にしてください。 Form1のソースです。
Button1のClickでForm2を開きます。 Button2のClickで全て閉じます。 | ||||
|
投稿日時: 2006-02-13 21:16
Form2 だけしか管理しないのであれば、厳密な型を使ったほうがいいですね。
キャスト、遅延バインディングもなるべく避けるに限ります。 質問者さんのソースに加えるとするならば、 ArrayList から Remove する場所で Close するだけですね。 何故わからないのだろうと思ったのですが、キャストがわからなかったのかな? いや、それにしても frm2 の配列があったり、ArrayList があったりと、 どっちで管理したいのか、かなりの謎ではあるんですが... 配列の長さを決め打ちするのは良くないですね。 動的に配列を確保して、動的に長さを取得しましょう。 intFrmNum は必要ないです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-02-13 22:22
えっと、、、.cs ファイルをメモ帳で見る、という手もあります。 C# から VB.NET への変換は、そういうことをしてくれるサイトがあるそうです。 | ||||
|
投稿日時: 2006-02-14 11:06
素晴らしい、希望通りの実行が実現しました!!
一郎さん、心より感謝します。 じゃんぬめっとさんも、再度御助言頂き、ありがとうございました。 Jittaさん、仰るようなツールがあるとは知りませんでした。 http://www.masahiko.info/it/archives/000388.html 活用させていただきます。ありがとうございます。 frm2を配列にしていたのは、複数開き、全てを閉じるので、 個別のfrm2を識別するために配列にしなくてはならないと思っていたからです。 したがって、一番驚いたのは、一郎さんに頂いたコードの通り、 配列にしていなくても、単純にArrayListに格納していくだけでOK、という点です。 一郎さんの「初めはだれでもそうです。 」の言葉に甘えることなく、 ステップアップに全力を尽くして行きたいと思います。 では、またの機会がございましたら、懲りずにお付き合い頂ければ幸いです。 御協力いただいた皆様、改めて感謝いたします。 そして、このような有用な場を御提供いただいているITMedia様にも感謝です。 ありがとうございました。 |
1