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

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

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

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

1回答

4038閲覧

form1のインスタンスをform2に渡したい

moconyan

総合スコア18

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

1クリップ

投稿2019/04/25 05:16

やろうとしていること

Form1のボタンを押すとForm2(書き込みフォーム)が開く、
データを入力し、ボタンを押すとクエリが実行される
Form1のDataGridViewに反映される

Form1

c#

1public partial class Form1 : Form 2 { 3 // 接続文字列クラス 4 Server server = new Server(); 5 // 接続保持用フィールド 6 NpgsqlConnection connsql = new NpgsqlConnection(); 7 // データテーブル 8 public static DataTable dt= new DataTable(); 9 10 public Form1() 11 { 12 InitializeComponent(); 13 } 14 15 private void Form1_Load(object sender, EventArgs e) 16 { 17 // サーバー接続 18 try 19 { 20 // PostgreSQLへ接続 21 connsql = new NpgsqlConnection(server.conn_str); 22 connsql.Open(); 23 } 24 catch (Exception ex) 25 { 26 // エラー 27 MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, 28 MessageBoxIcon.Error); 29 30 return; 31 } 32 // クエリ実行 33 ExecutionQuery("SELECT * FROM article", dt); 34 35 // 結果を表示 36 dataGridView1.DataSource = dt; 37 }

クエリ実行メソッド(Form1)

c#

1public void ExecutionQuery(string DB, DataTable table) 2 { 3 try 4 { 5 using (var sdr = connsql.CreateCommand()) 6 { 7 sdr.CommandText = DB; 8 var sda = new NpgsqlDataAdapter(sdr); 9 sda.Fill(table); 10 } 11 } 12 catch (Exception ex) 13 { 14 // エラー 15 MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); 16 17 return; 18 } 19 }

Form2

c#

1 private void button1_Click(object sender, EventArgs e) 2 { 3 var date = DateTime.Now; 4 int id_a= (int)Form1.dataGridView1.CurrentRow.Cells[0].Value; 5 6 // 書き込み 7 string sql = $@" 8 INSERT 9 INTO 10 rental 11 (id_a, 12 id_s, 13 update_date, 14 place, 15 status) 16 VALUES( 17 '{id_a}', 18 '{textBoxID.Text}', 19 '{date}', 20 '{comboBoxPlace.Text}', 21 '{comboBoxStatus.Text}') 22 "; 23 24 // クエリ実行 25 Form1.ExecutionQuery(sql, Form1.dt); 26 // 結果を表示 27 Form1.dataGridView1.DataSource = Form1.dt; 28 }

Form2エラー:
CS0120 静的でないフィールド、メソッド、またはプロパティ 'Form1.dataGridView1' で、オブジェクト参照が必要です
CS0120 静的でないフィールド、メソッド、またはプロパティ 'Form1.ExecutionQuery(string, DataTable)' で、オブジェクト参照が必要です
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
CS0120 静的でないフィールド、メソッド、またはプロパティ 'Form1.dataGridView1' で、オブジェクト参照が必要です

解決方法としてform1のインスタンスをform2に渡すというのを見つけたのですがどうすればいいのかわかりません。
またForm2からForm1のクエリ実行メソッドを実行することは不可なのでしょうか??

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

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

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

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

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

guest

回答1

0

Form1のボタンを押すとForm2(書き込みフォーム)が開く、

そのコードが見当たりませんが・・・

Form1 のボタンをクリックすると、そのイベントハンドラで Form2 を初期化して開いているのであれば、Form2 のコンストラクタに Form1 から渡したいオブジェクトへの参照を引数に持つものを追加して、そのコンストラクタをつかって Form2 を初期化するときに渡せば良いのでは?

投稿2019/04/25 05:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

moconyan

2019/04/25 05:40

すみません、ボタンクリック時のイベントはこちらです。 private void buttontake_Click(object sender, EventArgs e) { DialogResult result = MessageBox.Show("", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Information); // 判定 if (result == DialogResult.OK) { // 入力フォーム Form2 form2 = new Form2(); form2.ShowDialog(); } else if (result == DialogResult.Cancel) { // キャンセル選択時 // 元の画面に戻る return; } }
退会済みユーザー

退会済みユーザー

2019/04/25 05:51

上の回答で言っている Form2 にコンストラクタを追加するということの意味が分かりますか?
moconyan

2019/04/25 06:03

ご返信ありがとうございます。 わからなかったので少し調べてみましたが、持っていなかった知識なのでまだ理解ができておりません..!
退会済みユーザー

退会済みユーザー

2019/04/25 06:14

ざっとコードを見てみましたが、はっきり言ってメチャクチャという感じで、表題の「form1のインスタンスをform2に渡したい」ができたとしても、やりたいことの「データを入力し、ボタンを押すとクエリが実行される Form1のDataGridViewに反映される」はできないようです。全面的に考え直した方がよさそうです。
moconyan

2019/04/25 06:17

メチャクチャですか...ごめんなさい ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/04/25 06:26 編集

Form1 と Form2 に分けるまえに、Form1 だけを使って期待通り動くかどうかやってみてはいかが? ExecutionQuery メソッドは DataTable を生成するためのものですよね。それを Form1 で ExecutionQuery("SELECT * FROM article", dt); のように使うのはよさそうですが、Form2 の button1_Click は INSERT クエリですよね。INSERT クエリに ExecutionQuery メソッドはどう考えても使えないと思うのですが。
moconyan

2019/04/25 06:34

別のアプリを作った際に同じフォーム上で上記のメソッドとクエリで思ったように動きました。 メチャクチャで申し訳ございませんでした。
退会済みユーザー

退会済みユーザー

2019/04/25 06:44

> 別のアプリを作った際に同じフォーム上で上記のメソッドとクエリで思ったように動きました。 別のアプリではなく、今回のアプリでやってみてはいかが。Npgsql では sda.Fill(table); で INSERT できるのですか?
moconyan

2019/04/25 06:57

今回のアプリで今試してみましたができました。
退会済みユーザー

退会済みユーザー

2019/04/25 08:05

できるはずはないと思うのですが、とりあえずそれは置いときましょう。Form1 への参照が Form2 に渡せれば少なくとも今質問に書いてある例外は出なくなるようですので、Form2 のコンストラクタに、 pubic Form2(Form Form1) { InitializeComponent(); } というようなコンストラクタを追加し、buttontake_Click メソッドで Form2 form2 = new Form2(); に代えて、 Form2 form2 = new Form2(this); としたらどうなりますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問