質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

Q&A

解決済

2回答

1532閲覧

WinFormで別フォームからDataをDataGridViewに表示できない

FacePanel

総合スコア48

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

0グッド

0クリップ

投稿2018/09/24 04:55

編集2018/09/25 14:55

Windows Formsで本体のFormとは別のFormにADO.NETのDataTableを渡して、そのFormから元のFormのDataGridViewにdetaGridView1.DataSource = table1と、データを表示させようとしても、元の本体のFormのDataGridViewに変化が起こりません。
一体どうしてなのでしょうか?
データのソースを示して質問したいのですが、コードが長すぎて出来ません。
なお、DataTableのtable1のデータはSQL Serverのものです。

よろしくお願い致します。

質問を編集させていただきます。

まず、前スレッドは削除依頼をしました。また、Visual Studio Community 2017 Version 15.8.4です。

NewForm form1 = new NewForm();
form1.Server = serverName;
form1.Authentic = authentic;
form1.LogName = loginName;
form1.LogPass = loginPass;

form1.Table = dataTable;
form1.Show();

なお、このserverName, authentic, loginName, loginPassは、SQL Serverのものです。

また、この現象を再現する最小限のものを提示したいのですが、まだ、再現できる状態でお見せできる状態にはなっていません。
ただ、怪しいのは、大元のFormをNewFormのなかで、MotoForm form = new MotoForm();というコードを入れたうえで、そのdataGridView1のDataSourceにDataTableを入れたことで、元々表示されていたMotoFormとは別のMotoFormのdataGridView1に
DataTableを表示させていたのかも知れません。再現できるコードの提示とは別に、ちょっと調べてみます。

あと、NewFormの呼び出しに当たっては、上記のloginNameなどとは別に、

C#

1 form1.NewForm = this; 2コード

とし、NewFormのcs内では、

C#

1 public Form NewForm 2 { 3 get { return newForm; } 4 set { newForm = value; } 5 }

として、newformにMotoFormを渡しておりました。

このため、問題は、別フォームからDataGridViewに表示できないという問題ではなくて、別フォームから元のMotoFormに戻れないということのようです。

というのも、別フォームのボタンクリックイベントとして、

C#

1motoForm.SetDataOnGrid(server, authentic, logname, logpass, f, c, l, a, s);

というように、motoFormのメソッドにアクセスするためにMotoForm form = new MotoForm();というコードが必要だったからです。

MotoForm form = new MotoForm();というコードを利用しないで、MotoFormのdataGridView1にDataTableを表示させるにはどうしたらよいのか、という問題のようでした。

ここまでで、何を言いたいのかわかっていただけたでしょうか?


ややっこしいといけないので、あらためてのエッセンスだけにしたものを提示させていただきます。

C#

1// 親フォームは以下のコード 2namespace FormsApp 3{ 4 public partial class OyaForm : Form 5 { 6 public OyaForm() 7 { 8 InitializeComponent(); 9 } 10 11 private void oyaButton_Click(object sender, EventArgs e) 12 { 13 KoForm koForm = new KoForm(); 14 koForm.Show(); 15 } 16 } 17} 18 19// 子フォームには以下のコード 20 private Form oyaForm = new Form(); 21 private string sKoText = ""; 22 23 public KoForm() 24 { 25 InitializeComponent(); 26 } 27 28 public Form justOyaForm 29 { 30 get { return oyaForm; } 31 set { oyaForm = value; } 32 } 33 34 35 private void koButton_Click(object sender, EventArgs e) 36 { 37 if (koBox.Text != "") 38 { 39 sKoText = koBox.Text; 40 Form oya = new OyaForm(); 41 oya.oyaBox.Text = sKoText; // ここがエラーとなって、コンパイルできません。 42 } 43 }

最小限というと、こんなところです。上記、エラー部分をどうしたらよいでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/24 05:22

開発環境(OS, .NET, Visual Studio のバージョン、DB は何かとそのバージョンなど)を書いてください。どのように「別のForm」に DataTable を渡しているのか書いてください。
Zuishin

2018/09/24 05:44

使っているものをそのまま書くのではなく、新しく最小限のものを作ってそのコードを貼ってください。
FacePanel

2018/09/24 06:01

まず、前スレッドは削除依頼をしました。また、Visual Studio Community 2017 Version 15.8.4です。
Zuishin

2018/09/24 07:04

コードはコードブロックに入れてください。最小限というのはコンパイルできて問題が再現する最小限という意味で、「あ」でも「う」でも書けばいいというわけではりません。
Zuishin

2018/09/24 07:05

たとえば Ahthentic とか LogPass は問題の再現に必要ありませんし、form1 は元のフォームではなく新しいフォームですよね? それだと質問本文と食い違います。
YAmaGNZ

2018/09/24 11:20 編集

NewFormのほうの実装はどうなっているのでしょうか? というか、DataGridViewが一切出てきませんが、どうなっているのでしょうか?
guest

回答2

0

NewForm(form1)のnewFormにMotoFormをセットするのであれば
NewForm側でMotoFormを呼び出すのは

C#

1newForm.SetDataOnGrid(server, authentic, logname, logpass, f, c, l, a, s);

なのではないのですか?

クラス名やプロパティ名は変えた方がいいでしょう。
NewFormクラスのnewFormプロパティにMotoFormをセットする。
NewFormクラスから見たら、MotoFormがnewFormとなるので
説明するだけでこんがらがりますよね

投稿2018/09/24 15:15

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

NewFormのなかで、MotoForm form = new MotoForm();というコードを入れたうえで、そのdataGridView1のDataSourceにDataTableを入れたことで、元々表示されていたMotoFormとは別のMotoFormのdataGridView1に

DataTableを表示させていたのかも知れません。

これをしているならそれが原因です。

#追記

次を試してください。
まず、oyaBox が private だと思うので、外からは oyaBox にアクセスできないはずです。
そこで public プロパティからテキストにアクセスできるようにしました。
次に、KoForm のインスタンスを作成した後に自身のインスタンスを渡すようにしました。
それから、oyaForm のインスタンスが無駄に複数作成されていたのを削除しました。
最後に、sKoText を oyaBox.Text ではなく先ほど作った oyaBoxText に代入するよう変更しました。

C#

1// 親フォームは以下のコード 2namespace FormsApp 3{ 4 public partial class OyaForm : Form 5 { 6 public OyaForm() 7 { 8 InitializeComponent(); 9 } 10 11 public string oyaBoxText 12 { 13 get { return oyaBox.Text; } 14 set { oyaBox.Text = value; } 15 } 16 17 private void oyaButton_Click(object sender, EventArgs e) 18 { 19 KoForm koForm = new KoForm(); 20 koForm.justOyaForm = this; 21 koForm.Show(); 22 } 23 } 24} 25 26// 子フォームには以下のコード 27 private Form oyaForm; 28 private string sKoText = ""; 29 30 public KoForm() 31 { 32 InitializeComponent(); 33 } 34 35 public OyaForm justOyaForm 36 { 37 get { return oyaForm; } 38 set { oyaForm = value; } 39 } 40 41 42 private void koButton_Click(object sender, EventArgs e) 43 { 44 if (koBox.Text != "") 45 { 46 sKoText = koBox.Text; 47 justOyaForm.oyaBoxText = sKoText; // ここがエラーとなって、コンパイルできません。 48 } 49 }

投稿2018/09/24 14:52

編集2018/09/26 00:25
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FacePanel

2018/09/24 15:05

ご回答ありがとうございます。実は、NewFormで得たIDを元にMotoFormのメソッドでそのIDに該当するDataTableをdataGridView1に表示させようとしているところなのですが、NewForm以外に現在表示されたままの元のMotoFormのdataGridView1に表示させるためのMotoForm自体にアクセスする方法が分からないのですが、どうしたらよいのでしょうか?説明がつたなくて、大変申し訳ないのですが、よろしくお願い致します。
Zuishin

2018/09/25 00:55

ややこしいのでソースください。 実際使っているものではなく、最初から作り直して問題が再現する最小限のものでお願いします。 何もないと私が最初から作らなければなりませんが、それだと思ったものとは違うものになると思います。
FacePanel

2018/09/25 13:58

申し訳ありませんが、少々お時間をください。なぜなら、まだまだ初心者で、サンプルを作るにも時間がかかるので。
Zuishin

2018/09/25 14:07

そんな複雑なことをしてるんですか? フォーム二つと DataGridView だけで、データベース接続なんかもいらないんですよ。
FacePanel

2018/09/25 14:08

もうしわけありません。ちょっと、てこずってます。
FacePanel

2018/09/25 23:38

OyaFormのoyaBoxのModifiersをPublicにしました(今までこんなことが出来るとは、つゆ知らずでした)。 ですが、やはりjustOyaForm.oyaBoxText = sKoText;のところで、エラーです。 public string oyaBoxTextにしてます。 Error CS1061 'Form' does not contain a definition for 'oyaBoxText' and no accessible extension method 'oyaBoxText' accepting a first argument of type 'Form' could be found (are you missing a using directive or an assembly reference?)とのことですが、いかがしたらよいのでしょうか?あとちょっとのようで、わくわくしているところですが(昨晩はテーブルの上で眠ってしまいまして、失礼しました)。
Zuishin

2018/09/25 23:40

私の回答と違うことをしているのが原因です。 まずは同じようにしてみてください。
FacePanel

2018/09/25 23:50

お忙しいところ、おそれいります。 oyaButton_ClickのところのKoForm.justOyaForm = this; は、koForm.justOyaForm = this;ですよね?
Zuishin

2018/09/26 00:01

間違えていたので修正しました。
Zuishin

2018/09/26 00:05 編集

そのエラーには日本語で「oyaBoxText がない」と書いてあります。 ですから、Modifiers をいじるのではなく、私の回答のように oyaBoxText を作らなければなりません。 Modifiers をいじってフィールドを外側に公開するのはあまりよくないので、このように必要なプロパティだけ公開してください。
YAmaGNZ

2018/09/26 00:22

justOyaFormがForm型となっているので、justOyaForm.oyaBoxTextの時にキャストするか、プロパティをOyaForm型にしないといけないのでは?
Zuishin

2018/09/26 00:25

そうでした。そこも間違えていましたので修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問