tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルフォーム間のデータのやり取り
記事No7963
投稿日: 2008/08/15(Fri) 20:18
投稿者謎の自営業者
初めまして、謎の自営業者と申します。
VB2008の質問なんですがこちらでよかったですか?

質問したいのはForm1でファイルから読み込んだ2次元データを
Form2のListViewに表示したいのですが、そんなことは可能なのでしょうか?
できるのであれば、その方法を教えて頂けないでしょうか?
初心者なもので、自分なりに色々と調べてみましたが、結局分かりませんでした。
今はわざわざ各フォームで1000に近いデータを毎回読み込んでいるので
処理速度が大変遅いのです。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: フォーム間のデータのやり取り
記事No7964
投稿日: 2008/08/15(Fri) 20:55
投稿者魔界の仮面弁士
> VB2008の質問なんですがこちらでよかったですか?
OK です。(掲示板ロゴには2005までしか無いですけれどね)


> 質問したいのはForm1でファイルから読み込んだ2次元データを
> Form2のListViewに表示したいのですが、そんなことは可能なのでしょうか?
もちろん可能ですが、その場合、その2次元データをどこで管理するのか
(Form1 上にデータを持つのか、Form2 上に持つのか、それ以外の場所か)、そして、
それぞれのフォームの関係(ShowDialog での呼び出しなのかどうかなど)が
どうなっているのかなどに応じて、幾つかの書き方があります。

 (案1) Form1 が、Form2 上の ListView1 にデータを書き込む。
 (案2) Form1 がデータを Form2 に渡し、Form2 が ListView1 にデータを書き込む。
 (案3) Form2 が、Form1 にデータを問い合わせて、それを ListView1 に書き込む。
 (案4) Form1/Form2 以外の場所でデータを管理し、Form1/Form2 双方から利用する。

また、そのデータの渡し方にしても、Property, Function, Sub, Event など
幾つかの方法があります。

とりあえず、現状の「処理速度の大変遅いコード」を簡略化したものを、ここに
提示する事はできますか? それに合わせて、何らかのサンプルを出せるかも知れません。


ところで、ListView ではなく、DataGridView を使うというのは駄目でしょうか?
データの受け渡しを DataTable で行うようにすれば、画面への表示は
DataSource プロパティに渡すだけで済むので、処理が簡単になるのですけれども。

[ツリー表示へ]
タイトルRe^2: フォーム間のデータのやり取り
記事No7969
投稿日: 2008/08/18(Mon) 12:08
投稿者謎の自営業者
返事が遅れてすみません。

> もちろん可能ですが、その場合、その2次元データをどこで管理するのか
> (Form1 上にデータを持つのか、Form2 上に持つのか、それ以外の場所か)、そして、
> それぞれのフォームの関係(ShowDialog での呼び出しなのかどうかなど)が
> どうなっているのかなどに応じて、幾つかの書き方があります。

FORM1で読み込んだデータをFORM1のListViewに表示しています。
そのデータから色々と演算処理するのがForm2です。
ですので、今はForm1でもForm2でもデータを読み込んでる状態です。

Form1のリストビューの表示内容をForm2で読み取るか、
Form1で読み込んだデータをそのまま流用できればいいのですが、
コンマ区切りのテキストデータを Microsoft.VisualBasic.FileIO.TextFieldParserで
読み込んでいます。(400x11の2次元データにして読み込み)
それを  Me.ListView1.Items.AddでループさせてListViewで表示させています。
Form2の方では11のカテゴリに分類してその統計などを取っています。

      

[ツリー表示へ]
タイトルRe^3: フォーム間のデータのやり取り
記事No7974
投稿日: 2008/08/19(Tue) 13:56
投稿者魔界の仮面弁士
> FORM1で読み込んだデータをFORM1のListViewに表示しています。
> そのデータから色々と演算処理するのがForm2です。

コンマ区切りのテキストデータを、Form1 で読み込んだ後、
ListView に表示するための「FORM1 で読み込んだデータ」を、
どこで管理しているのかが重要です。

Form1 自身で管理されているのであれば、その「読み込んだデータ」を
 (A案) Form1 が Form2 に渡す。
 (B案) Form2 が、Form1 に問い合わせる。
のいずれかを行う必要がありますよね。

現在は
 (C案) Form2 でも、Form1 と同様に読み込み処理を行う。
としているようですけれども。

それとも「読み込んだデータ」は、ListView に表示したら、
変数に保持させずに、そのまま読み捨ててしまっているのでしょうか?

もしもデータを保持しているのであれば、それを、自作プロパティ経由で渡したり、
あるいは、自作メソッドの引数として受け渡すようにすれば OK かと。

(あるいは、読み込んだデータを ListView 上で管理しているのかな?)



> Form1のリストビューの表示内容をForm2で読み取るか、
Form2 が、Form1.ListView1 を直接読み取ったり、
Form1 が、Form2.ListView1 に直接書き込むといった実装は可能ですが、
それはあまり推奨されません。


たとえば、『InputBox』を表示する場合には、
 Dim ret As String = InputBox("本文", "タイトル", "初期値")
のように書きますよね。すなわち、
 Dim fm As Form = 〜〜
 fm.Controls("Label").Text  = "本文"
 fm.Text = "タイトル"
 fm.Controls("TextBox").Text = "初期値"
 fm.ShowDialog()
のように、フォームのメンバーに直接アクセスさせるようにはなっていません。

コントロールを直接操作させるのではなく、コントロールの値を読み書きする
プロパティやメソッドを作成するべきです。
(その方が、後からコントロールの追加や変更が行われた場合にも対応しやすいですし)



> ですので、今はForm1でもForm2でもデータを読み込んでる状態です。
テキストから読み込んだデータを、DataTable クラスあるいは ListViewItem 配列などに
蓄えておいては如何でしょう。

たとえば DataTable 管理なら、LINQ を使って簡単に集計処理が行えますよね。
あるいは ListViewItem 配列で管理するなら、
 Dim data() As ListViewItem = 「読み込んだデータ」
 ListView1.Items.AddRange(DirectCast(data.Clone(), ListViewItem()))
のようにして、簡単に ListView に登録できますし。

[ツリー表示へ]
タイトルRe^4: フォーム間のデータのやり取り
記事No7975
投稿日: 2008/08/21(Thu) 00:14
投稿者謎の自営業者
丁重なご説明ありがとうございます。
ListViewItemで一度試してみます。
仕事の都合で今時間があまり取れないので、空いた時間で何とかがんばってみます。
本当にありがとうございました。

[ツリー表示へ]