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

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

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

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

Q&A

解決済

2回答

1341閲覧

WindowsFormで新しいFormをOpenした場合、旧Formの変数やDataGridViewデータがNull扱いされる事の対応

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2020/12/17 05:30

前提・実現したいこと

VisualStudioでC#のwindowsform機能を利用しています。
Form1でofficeのAccessに接続したデータをDataGridViewへ表示し、更新ボタンを追加しています。
更新ボタンを押すとForm2を開き、DataGridViewからToString()でtextboxへ値を挿入し、Form2の更新ボタンを押すとForm1のDataGridViewへデータを挿入し更新する形を考えています。
しかし一度Form2へ遷移した場合、Form1のDataGridViewのデータがなくなって(参照できなく?)しまいます。
Form1をClose()やDispose()処理を行っていないにも関わらずForm2から参照出来ないのは仕様でしょうか。

発生している問題・エラーメッセージ

Form1からForm2へのデータ挿入は出来ましたがForm2からForm1へのデータ挿入が出来ません。
下記のエラーメッセージからDataGridViewのセル指定が正常に行われていないのは理解しています。
しかし内部データを確認すると、Set時に使用出来ていたdataGridViewMasterListのデータがGet時にはNullデータ扱いになっていました。
そのためindex値を[0,0][1,1]等にしてもエラーが発生します。

エラーメッセージ System.ArgumentOutOfRangeException: 'インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 パラメーター名:index' 'dataGridViewMasterList[2, CrRow].Value' は型 'System.ArgumentOutOfRangeException' の例外をスローしました

該当のソースコード

C#

1//Form1=FormMasterList 2//Form2=FormDataUpdate 3 4//Form1の記述 5 private void DgvSet() 6 { 7 CrRow = dataGridViewMasterList.CurrentRow.Index; 8 FormDataUpdate.Instance.textBoxUpdateHinban.Text = dataGridViewMasterList[2, CrRow].Value.ToString(); 9 FormDataUpdate.Instance.textBoxUpdateHinmei.Text = dataGridViewMasterList[3, CrRow].Value.ToString(); 10 } 11 public void DgvGet() 12 { 13 dataGridViewMasterList[2, CrRow].Value = FormDataUpdate.Instance.textBoxUpdateHinban.Text; 14 dataGridViewMasterList[3, CrRow].Value = FormDataUpdate.Instance.textBoxUpdateHinmei.Text; 15 } 16 private void dataGridViewMasterList_CellContentClick(object sender, DataGridViewCellEventArgs e) 17 { 18 DataGridView dgv = (DataGridView)sender; 19 //"Button"列ならば、ボタンがクリックされた 20 if (dgv.Columns[e.ColumnIndex].Name == "Button") 21 { 22 FormDataUpdate.Instance.Show(this); 23 DgvSet(); 24 } 25 } 26//Form2の記述 27 //ただ一つのフォームのインスタンスを保持するフィールド 28 private static FormDataUpdate _instance; 29 30 //ただ一つのフォームにアクセスするためのプロパティ 31 public static FormDataUpdate Instance { 32 get { 33 //_instanceがnullまたは破棄されているときは、 34 //新しくインスタンスを作成する 35 if (_instance == null || _instance.IsDisposed) { 36 _instance = new FormDataUpdate(); 37 } 38 return _instance; 39 } 40 } 41 private void buttonSuccession_Click(object sender, EventArgs e) 42 { 43 FormMasterList fml = new FormMasterList(); 44 fml.Activate(); 45 this.Close(); 46 fml.DgvGet(); 47 } 48

試したこと

get処理の記述を全て空欄にして処理を行わない状態で再度set処理を行う手順を実行。
Null判定にならずForm2へデータを挿入できました。

補足情報(FW/ツールのバージョンなど)

VisualStudio2019
windows10

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

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

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

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

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

guest

回答2

0

インスタンスやフォームの遷移について正しく学習されるべきかと思います。

FormDataUpdateにて

C#

1FormMasterList fml = new FormMasterList();

とされています。
なので、今まで表示されていたFormMasterListと別のFormMasterListが生成されます。
別物なので当然そのフォームに属するコントロールも別物となります。

投稿2020/12/17 05:43

YAmaGNZ

総合スコア10489

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

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

退会済みユーザー

退会済みユーザー

2020/12/17 05:52

ご回答ありがとうございます。 もう一度該当の箇所を覚えなおします。
guest

0

ベストアンサー

FormMasterList fml = new FormMasterList();

これが "Form1" のつもりなのであれば,
まともなデータを持ってない新しいForm1型インスタンスを作ってそいつに対してfml.DgvGet();としているからでは?

投稿2020/12/17 05:37

fana

総合スコア11996

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

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

退会済みユーザー

退会済みユーザー

2020/12/17 05:46

>まともなデータを持ってない新しいForm1型インスタンスを作ってそいつに対してfml.DgvGet();としているからでは? すみませんその通りです。 とても簡単な見落としでした。 最も早かったためベストアンサーにさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問