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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.82298 の関連記事表示

<< 0 >>
■82298  二つのフォームで一つのモジュールを共有して使う方法
□投稿者/ あああ -(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に見つかりませんでした
    というエラーが出てしまいます。

    どうすれば良いでしょうか?
親記事 /過去ログ140より / 関連記事表示
削除チェック/

■82299  Re[1]:
□投稿者/ Azulean -(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 ベースでの解決は難しいと思います。
    他者がイメージできるようにもっと説明を付け足してください。
記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82300  Re[2]:
□投稿者/ あああ -(2016/12/31(Sat) 19:01:26)
    form2は、DataGridView1が置いてあるform1をコピーして作ったものなので
    form2にもDataGridView1はあります。

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

    マルチスレッドにしているのが原因でしょうか?
     
記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82301  Re[3]:
□投稿者/ あああ -(2016/12/31(Sat) 19:05:35)
    すいません、役割を書きます。
    複数のフォルダーを読み込んでそのフォルダー内のファイルサイズやファイル数などをリストするプログラムを作りました。

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

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

    それでモジュール1を使い回したいのですが
    なぜかうまくいきません。
     
記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82302  Re[4]:
□投稿者/ Azulean -(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 やそこに置いているコントロールを扱うことは別の例外を招く可能性はあります。
    メインスレッドで操作する限り、大きな問題はありません。
記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82303  Re[5]:
□投稿者/ あああ -(2016/12/31(Sat) 19:45:24)
    ありがとうございます。

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

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

    何の設定でしょうか?
     
記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82304  Re[6]:
□投稿者/ Azulean -(2016/12/31(Sat) 20:10:44)
    2016/12/31(Sat) 21:38:00 編集(投稿者)

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

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

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

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

    「Object 型なのに、なぜ DataGridView1 にアクセスできるのか?」は、いずれ疑問を感じられるようになれるとよいですが…。
    そうなってくれば、Friend ではダメな理由を理解するための前提が整う感じです。
記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82309  Re[7]:
□投稿者/ あああ -(2017/01/01(Sun) 12:16:24)
    ありがとうございます。

    あとは自分で勉強します。
記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82323  Re[8]:
□投稿者/ あああ -(2017/01/02(Mon) 11:52:27)
    少し調べてみたのですが
    http://pb-times.jp/P_522ebab260954

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

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


記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82367  Re[9]:
□投稿者/ shu -(2017/01/05(Thu) 15:09:47)
    No82323 (あああ さん) に返信

    > なぜできなかったのでしょうか?
    Object型を使った遅延バインディングを使用しているから
    DataGridViewを探すための処理が
    Microsoft.VisualBasic.CompilerServices
    内のクラスで行わる為、このクラスからみたらPublicでないと
    アクセス出来ない為です。
記事No.82298 のレス /過去ログ140より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -