前提・実現したいこと
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/12/17 05:52