C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

別フォーム(クラス)から同じDataTableを参照したい

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■89869 / inTopicNo.1)  別フォーム(クラス)から同じDataTableを参照したい
  
□投稿者/ タック (1回)-(2019/01/11(Fri) 10:10:15)

分類:[VB.NET/VB2005 以降] 

サンプルを見ながら何本かVB.NETで作成してきたのですが、基本が理解できていないため躓きながらなんとか作成してきた初心者です。
今回は、前から理解できていない内容を教えていただきたく質問いたしました。

(Windows10 64bit、Visual Studio2017、VB.NET、ターゲットフレームワーク.NET Framework4.6.2で開発しています)

新規プロジェクトにForm1とForm2を追加し、モジュールの追加でデータセットDataSet1.xsdを作成しその中にDataTable(DataTable1)を作成いたしました。

Form1でDataTable1を使用するために
Dim ds As New DataSet1()
Dim dt As DataTable = ds.DataTable1
と、新しいインスタンスを作成いたしました。

●質問
Form1でDataTable1にデータを入力したとして、Form2から同じDataTable1を参照する方法を教えていただけますでしょうか?

わからないなりにいくつか方法を考えたのですが実現方法が分かりませんでした。
1.Form2から、Form1でインスタンス化したDataTable1を指定する方法
2.Form1やその前にモジュールなどでインスタンス化する際に他のクラスからも参照できるグローバルな宣言をする方法
3.DataSet1.xsdを作成する際やコードの指定で同じプロジェクト内であればどのクラスからでも参照できる宣言方法

オブジェクト指向型の基本がよく理解できていないため、ピント外れなことを質問している自覚はあるのですが、本来はどうすべきなどとお考えをお聞かせいただければと思います。

今まではForm1上にDataGridViewを作成し、そのプロパティでDataSourceにDataTable1BindingSourceを指定してきました。

よろしくお願いいたします。
引用返信 編集キー/
■89870 / inTopicNo.2)  Re[1]: 別フォーム(クラス)から同じDataTableを参照したい
□投稿者/ WebSurfer (1725回)-(2019/01/11(Fri) 10:28:28)
No89869 (タック さん) に返信

> Form1でDataTable1にデータを入力したとして、Form2から同じDataTable1を参照する方法を教えていただけますでしょうか?

Form1 で Form2 を初期化して表示しているのであれば、Form2 のコンストラクタに
DataTable を引数に持つものを作り、初期化する際に DataTable への参照を渡して
はいかがですか?。
引用返信 編集キー/
■89871 / inTopicNo.3)  Re[2]: 別フォーム(クラス)から同じDataTableを参照したい
□投稿者/ タック (2回)-(2019/01/11(Fri) 10:48:55)
No89870 (WebSurfer さん) に返信
> ■No89869 (タック さん) に返信

> Form1 で Form2 を初期化して表示しているのであれば、Form2 のコンストラクタに
> DataTable を引数に持つものを作り、初期化する際に DataTable への参照を渡して
> はいかがですか?。

早速のご返答ありがとうございます

確かにForm1からForm2を表示する際はそのような方法がとれそうですね。

ただ、今回は独立したフォーム(クラス)から同じDataTableを参照する方法はないかと思い質問いたしました。
将来を考えてこのような場合の考え方を確立できたらいいなと思っています。

すみません。
よろしくお願いいたします。
引用返信 編集キー/
■89872 / inTopicNo.4)  Re[3]: 別フォーム(クラス)から同じDataTableを参照したい
□投稿者/ とっちゃん (568回)-(2019/01/11(Fri) 11:34:07)
No89871 (タック さん) に返信
> ただ、今回は独立したフォーム(クラス)から同じDataTableを参照する方法はないかと思い質問いたしました。
> 将来を考えてこのような場合の考え方を確立できたらいいなと思っています。
>

「互いに無関係な独立フォーム同士で、同一のDataTableを参照する必要はないし、方法も存在しない」

とおもいます。

無関係ではないのなら、関係があるのでその関係の中で連動させればいいのではないでしょうか?

プログラムには唯一の正解というのは存在しません。なので、考え方次第でいくらでも変わりますので
目的と手段はそれぞれ別々に考える必要があります。

プログラムには必ず「目的」があります。それは、「Hello world」であってもです。

その「目的」を達成するために「手段」があります。

同じDataTable を参照するというのはあくまでも「手段」です。「目的」が独立したフォームの作成なのであれば、
そもそも連動しないので同じDataTableを持つ必要はないと考えます。

個人的には、将来を考えるなら
「同じデータをそれぞれ無関係なDataTable(やDataSet)で参照するにはどうすればいいか?」
を考えたほうがよいと思います。


引用返信 編集キー/
■89873 / inTopicNo.5)  Re[4]: 別フォーム(クラス)から同じDataTableを参照したい
□投稿者/ タック (3回)-(2019/01/11(Fri) 12:17:09)
No89872 (とっちゃん さん) に返信
> ■No89871 (タック さん) に返信

回答ありがとうございます。

そうですね。
問題をあまりにも普遍的に考えようとして、現実的ではない条件としてしまったようです。

現実にはどこからかForm2を呼ぶのですからその際に必要なものは渡してあげればいいのでしょう。

このパターンで作成してみます。

とっちゃん さん、WebSurfer さん
お忙しい中ご回答ありがとうございました。
解決済み
引用返信 編集キー/
■89874 / inTopicNo.6)  Re[3]: 別フォーム(クラス)から同じDataTableを参照したい
□投稿者/ WebSurfer (1726回)-(2019/01/11(Fri) 12:22:04)
No89871 (タック さん) に返信

> ただ、今回は独立したフォーム(クラス)から同じDataTableを参照する方法はないかと思い質問いたしました。

値型と参照型の区別ができてませんね? ググるなどして調べてみてください。

その上で・・・

DataTable は参照型です。なので、上の私のレスで紹介した方法は、まさしく「独立したフォーム(クラス)から
同じDataTableを参照」することになります。

なお、同じ DataTable というのは、正確には、同じ DataTable のインスタンスです。
引用返信 編集キー/
■89875 / inTopicNo.7)  別フォーム(クラス)から同じDataTableを参照したい
□投稿者/ タック (4回)-(2019/01/11(Fri) 13:15:47)
2019/01/11(Fri) 13:54:36 編集(投稿者)

No89873 (タック さん) に返信
> ■No89872 (とっちゃん さん) に返信
>>■No89871 (タック さん) に返信
>

値型と参照型についてちょっと勉強してみました。

なるほど。
DataTableは参照型なので、別のフォームを呼ぶ際に今使っているDataTableのインスタンスを渡してあげれば
別フォームでそのインスタンスを使って同じデータを使用できる、と理解いたしました。

後はDataTableのインスタンスの渡し方を記述できればいいのですね。

また勉強してみます。
解決済み
引用返信 編集キー/
■89876 / inTopicNo.8)  Re[6]: 別フォーム(クラス)から同じDataTableを参照したい
□投稿者/ WebSurfer (1727回)-(2019/01/11(Fri) 14:02:06)
No89875 (タック さん) に返信

> DataTableは参照型なので、別のフォームを呼ぶ際に今使っているDataTableのインスタンスを渡してあげれば
> 別フォームでそのインスタンスを使って同じデータを使用できる、と理解いたしました。

インスタンスを渡すわけではないです。インスタンスの位置を指している変数の値を渡すのです。

以下の記事の「図 3-8 値型変数と参照型変数の値の格納」の「参照型の変数」の方を見てください。

3-2 値型と参照型
https://msdn.microsoft.com/ja-jp/library/dd314344.aspx

インスタンスとはその図のメモリ上の位置 nnnn に存在する「String 型データの実体」です。

例えば Form1 で Dim S As String = "hello,world!" とし、その後 Form2(String X) というコンストラクタで
Form2 を初期化する際引数 X に S を渡す、即ち Form2 の X という変数に nnnn をコピーするということです。

インスタンスは一つしか存在しません。インスタンスを指す変数 S が Form1 に、変数 X が Form2 にぞんざい
することになります。

引用返信 編集キー/
■89877 / inTopicNo.9)  Re[7]: 別フォーム(クラス)から同じDataTableを参照したい
□投稿者/ タック (5回)-(2019/01/11(Fri) 15:07:16)
No89876 (WebSurfer さん) に返信
> ■No89875 (タック さん) に返信
>
> インスタンスを渡すわけではないです。インスタンスの位置を指している変数の値を渡すのです。
>

理解が不十分ですみません。
ご説明で整理できました。

きちんと理解していないと、そのつもりで記載しても違う意味になってしまいますよね。
気を付けます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ