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

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

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

二つのフォームで一つのモジュールを共有して使う方法

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

■82298 / inTopicNo.1)  二つのフォームで一つのモジュールを共有して使う方法
  
□投稿者/ あああ (1回)-(2016/12/31(Sat) 17:41:38)

分類:[.NET 全般] 

VB.NETです。

Form1内のsub
call test(form1)


Form2内のsub
call test(form2)


モジュール内のsub
sub test(ByVal frm As Form)

frm.DataGridView1 =(コードが書かれている)

end sub


というようにして
二つのフォームで一つのモジュール内のsubを共有して使うために
フォームを引数として渡したいのですが
エラー	1DataGridView1 はSystem.Windows.Forms.Formのメンバーではありません。

というエラーが出てうまくいきません。



sub test(ByVal frm As Object)

frm.DataGridView1 = (コードが書かれている)

end sub


とするとビルド時にはエラーが出なくなりますが

Form1では実行できるのですが
Form2で実行する時に

公開メンバーDataGridBiew1は型Form2に見つかりませんでした
というエラーが出てしまいます。

どうすれば良いでしょうか?

引用返信 編集キー/
■82299 / inTopicNo.2)  Re[1]:
□投稿者/ Azulean (753回)-(2016/12/31(Sat) 18:08:26)
2016/12/31(Sat) 18:10:51 編集(投稿者)

No82298 (あああ さん) に返信
> sub test(ByVal frm As Object)
> frm.DataGridView1 = (コードが書かれている)
> end sub
(略)
> Form1では実行できるのですが
> Form2で実行する時に
> 公開メンバーDataGridBiew1は型Form2に見つかりませんでした
> というエラーが出てしまいます。
>
> どうすれば良いでしょうか?

逆に問いたいのですが、どのようにしたいのでしょうか?

「Form1 には存在する DataGridView1 に対する操作」を「Form2 でも使い回したい」のであれば、「Form2 にも DataGridView1 を置く」しかありません。
しかし、この質問に至ると言うことは、「Form2 には DataGridView1 を置いていない」ようですが、それはなぜですか?

「Form2 には DataGridView1 を置かず」、「二つのフォームで一つのモジュール内のsubを共有して使う」ということは、どういったことを実現したいのか、伝わってきません。

少なくとも、DataGridView1 と Form1、Form2 の役割をきちんと他人が理解できる形で説明できないと、Web ベースでの解決は難しいと思います。
他者がイメージできるようにもっと説明を付け足してください。
引用返信 編集キー/
■82300 / inTopicNo.3)  Re[2]:
□投稿者/ あああ (2回)-(2016/12/31(Sat) 19:01:26)
form2は、DataGridView1が置いてあるform1をコピーして作ったものなので
form2にもDataGridView1はあります。

そのはずなのに、なぜかエラーが出てしまいます。

マルチスレッドにしているのが原因でしょうか?
 
引用返信 編集キー/
■82301 / inTopicNo.4)  Re[3]:
□投稿者/ あああ (3回)-(2016/12/31(Sat) 19:05:35)
すいません、役割を書きます。
複数のフォルダーを読み込んでそのフォルダー内のファイルサイズやファイル数などをリストするプログラムを作りました。

まずForm1にD&Dで複数フォルダーを読み込ませてdatagridview1に一覧表示します。
そしてボタンを押すことでモジュール1が動作し、datagridview1
にファイルサイズやファイル数をリスト化します。

その一覧の中でフォルダーをダブルクリックすることで
form1をコピーして作ったform2に同じくモジュール1を使って
そのフォルダー内の全てのファイル・フォルダーの
ファイルサイズやファイル数を一覧表示したいのです。

それでモジュール1を使い回したいのですが
なぜかうまくいきません。
 
引用返信 編集キー/
■82302 / inTopicNo.5)  Re[4]:
□投稿者/ Azulean (754回)-(2016/12/31(Sat) 19:24:58)
2016/12/31(Sat) 19:40:43 編集(投稿者)

No82300 (あああ さん) に返信
> form2は、DataGridView1が置いてあるform1をコピーして作ったものなので
> form2にもDataGridView1はあります。

Form1 は成功し、Form2 はエラーとなるとありますが、両方とも同じモジュールを呼び出し、かつ引数は frm As Object ですか?
また、DataGridView1 という名前は完全に一致していますか?
DataGridView1 に対する Modifiers プロパティが Form1 と Form2 で異なると言うことはありませんか?


> マルチスレッドにしているのが原因でしょうか?

ワーカースレッドやタスクで Form やそこに置いているコントロールを扱うことは別の例外を招く可能性はあります。
メインスレッドで操作する限り、大きな問題はありません。
引用返信 編集キー/
■82303 / inTopicNo.6)  Re[5]:
□投稿者/ あああ (5回)-(2016/12/31(Sat) 19:45:24)
ありがとうございます。

仰る通り、datagridviewのModifiers プロパティは全てFriendになっていたので
Publicにしたところ、うまくいきました。

戻っている、というかデフォルトの設定でこうなっていたのですが・・・
こんな設定、普通は気づかないと思うのですが・・・

何の設定でしょうか?
 
引用返信 編集キー/
■82304 / inTopicNo.7)  Re[6]:
□投稿者/ Azulean (755回)-(2016/12/31(Sat) 20:10:44)
2016/12/31(Sat) 21:38:00 編集(投稿者)

No82303 (あああ さん) に返信
> 戻っている、というかデフォルトの設定でこうなっていたのですが・・・
> こんな設定、普通は気づかないと思うのですが・・・
> 何の設定でしょうか?

まずは調べてみましょう。
その上でわからない点を聞いてください。

(こういう風に言う理由は、プログラムを作ることは、フレームワーク・ライブラリ・言語仕様などを調べ・理解することと切り離せません。聞くよりもまずは調べる・考えることに意識を向けて欲しいという願いからです)

-----
ちなみに、Modifiers の変更で済むのは VB.NET がある意味、特殊な言語だからです。
C# だと dynamic キーワードを使うか、リフレクションがいるなど、普通にはできないことです。

「Object 型なのに、なぜ DataGridView1 にアクセスできるのか?」は、いずれ疑問を感じられるようになれるとよいですが…。
そうなってくれば、Friend ではダメな理由を理解するための前提が整う感じです。
引用返信 編集キー/
■82309 / inTopicNo.8)  Re[7]:
□投稿者/ あああ (7回)-(2017/01/01(Sun) 12:16:24)
ありがとうございます。

あとは自分で勉強します。

引用返信 編集キー/
■82323 / inTopicNo.9)  Re[8]:
□投稿者/ あああ (8回)-(2017/01/02(Mon) 11:52:27)
少し調べてみたのですが
http://pb-times.jp/P_522ebab260954

PublicとFriendの違いは、
異なるプロジェクトからのアクセスができるか、できないかということになっています。

わたしが先ほどやっていた操作は
全てのクラス、モジュールが同じプロジェクト内に入っているので
Publicでなくとも
Friendでもモジュールからフォームの変更が行えたと思うのですが
なぜできなかったのでしょうか?



引用返信 編集キー/
■82367 / inTopicNo.10)  Re[9]:
□投稿者/ shu (952回)-(2017/01/05(Thu) 15:09:47)
No82323 (あああ さん) に返信

> なぜできなかったのでしょうか?
Object型を使った遅延バインディングを使用しているから
DataGridViewを探すための処理が
Microsoft.VisualBasic.CompilerServices
内のクラスで行わる為、このクラスからみたらPublicでないと
アクセス出来ない為です。
引用返信 編集キー/

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


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

このトピックに書きこむ