実現したいこと
ここに実現したいことを箇条書きで書いてください。
- Form2の画面が閉じられたとき、Form1の画面を再度ロードする
前提
このようにForm2で入力したデータを元にForm1に結果を表示するシステムを作っています。
Form2のデータはテキストファイルで保存され、Form1のロード時や更新ボタンを押したときに読み込んで使用します。
このシステムは画面を閉じずに常駐して動かしたいので、Form2で新しい入力があったときに保存ボタンで新しくデータを保存して、Form2が閉じられたときにその新しく保存されたファイルを再読み込みしたいのですが、何か良い方法はありませんでしょうか?
該当のソースコード
C#
1//ボタン1をクリックしてForm2を表示する 2private void button1_Click(object sender, EventArgs e) 3 { 4 // Form2のインスタンスを生成 5 Form2 form2 = new Form2(); 6 // form2を表示 7 form2.Show(); 8} 9 10private void Form1_Load(object sender, EventArgs e) 11{ 12//ロード時のファイル読み込み 13if (File.Exists(mastFile)) 14 { 15 //アラームの名前でグループ化してリストを作る 16 //名前をキー,1行全体をvalueとする 17 var alarm = File.ReadLines(mastFile, Encoding.GetEncoding("Shift_JIS")) 18 .Select(x => new { Key = x.Split(',')[0], Value = x, }) 19 .GroupBy(x => x.Key) //名前でグループ化する 20 .Select(x => string.Join(",", x.Select(y => y.Value))) 21 .ToList(); 22 23 string[] alarmList = alarm.ToArray(); //リストを配列化する 24 25 dataGridView1.Rows.Add(alarmList.Length); 26 27 //リストの名前をDataGridViewに入れる 28 for (int i = 0; i < alarmList.Length; i++) 29 { 30 string fileData = alarmList[i]; 31 string[] alarmData = fileData.Split(','); 32 name = alarmData[0].ToString().Replace("\"", ""); 33 dataGridView1.Rows[i].Cells[0].Value = name; 34 35 } 36 37 //マスタファイルを読み込む 38 StreamReader sr = new StreamReader(mastFile, Encoding.GetEncoding("SHIFT_JIS")); 39 int valNum = 0; //数値変換用の変数 40 41 while (!sr.EndOfStream) 42 { 43 //読んだ一行をカンマで区切って配列にする 44 string file = sr.ReadLine(); 45 string[] fileData = file.Split(','); 46 } 47 48 49 50
### 試したこと ### 補足情報(FW/ツールのバージョンなど) .NET Framework4.8
実現したいことの「Form2の画面が閉じられたとき、Form1の画面を再度ロードする」は
(1) 新しいForm1を生成する
(2) 既に表示してあるForm1の画面を更新する
のどちらでしょうか(今のコードでは(1))
また、「新しく保存されたファイルを再読み込み」し画面に反映する機能(メソッド)はForm1に既に存在しているのでしょうか?
Form2 を表示するときのコードが重要です。それによって処理が変わりますので提示してください。
> Form2が閉じたときにForm1をアクティブにして、Form1がアクティブになったときにファイルの読み込み処理をしよう
なんというか,回りくどくないですか?
やりたいことが「ファイルの読込処理」なのであれば,単純に/直接的にその「ファイルの読込処理」を実施する手段を用意すれば良いのでは? (「アクティブ」とかいう余計な要素をわざわざ間に挟む理由とは何か?)
「アクティブになったとき」という実装だと,「Form2が閉じたとき」以外のタイミングでもその処理が走ることになりかねないと思うのですが,そこは問題ないという考えなのでしょうか?
あなたの提示コードでは
> Form1 form1 = new Form1();
として,新しいインスタンスを生成していますが,これが所望の処理なのだとすれば,
「Form1のロード時」には件の処理が走る,という話なのですから,特別な対処は何も要らないのではありませんか?
(:単にその新しく生成したフォームを表示すればそこで「ロード時」の処理が走るのでは?)
おそらく,
(1)最初,Form1 が存在し,表示されている
(2)あるとき,Form2 を表示する
(3) (2)のForm2が閉じられる
(4) あなたがやりたいこと(Form1がファイルを読込んで何かする)
…という順序で物事が進むのだろうと想像しますが,
上記(2)の時点において,(1)で表示されていた Form1 のインスタンスというのはどうなるのですか?
(1)と(4)に登場する Form1 というのは同一のインスタンスなのですか? それとも別人ですか?
…といったあたりの話を明確にするべきではないでしょうか?
あなたの提示コードだと「(1)と(4)のForm1は別人」という話と見えますが,そうであれば前記したように特別な対処は不要と思えます.
そうではなくて「同一人物」たるべきなのであれば,別人をnewで生成するのではなく,元から存在した Form1インスタンスに処理をさせるべきでしょう.

おっしゃるように、
(1)最初Form1 が存在し,表示されている
(2)Form2画面へのボタンがクリックされたときにForm2 を表示する
(3) (2)のForm2が閉じられる
(4) Form1がファイルを読込む(読み込んだあと、Form1の画面は更新する)
の順序なので、別のインスタンスを生成する必要はなさそうです。勉強不足で申し訳ありません。
ファイルの読み込み処理自体はロード時に実装済みです。Form2の表示とともに該当ソースを質問に追加しました。
Form1は最初に開いた時以外は常に開いている状態なので、そこから再びロードの処理を走らせる方法が質問の趣旨でした。
コードが崩れています。
編集がうまくいっていないようです。

修正しました。

回答4件
あなたの回答
tips
プレビュー