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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

10620閲覧

C# ユーザーコントロールの終了処理と設定の保存

piglet

総合スコア47

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/09/08 13:33

こんにちは
現在、以下のようなアプリの設定用フォームを書いています

イメージ説明

左のリストボックスから項目を選ぶと右に対応した
ユーザーコントロールのパネルが張られる仕組みです。

この左側で別の項目が選ばれると前のパネルの設定を
一時保存の構造体へ保存してDisposeして次のパネルを張る仕組みにしたいのですが
ユーザーコントロールにUnload, Closing等の終了処理のイベントがないため
保存するタイミングがなくて困っています。OnDisposedに書いてみたのですが
やはりDisposedですので一部設定が既に読めなくなっており正常に保存できません

このような場合、どうすれば良いのでしょうか? 根本的な仕組みを変えるべきでしょうか?
そもそもユーザーコントロールではこのように使用してはいけないのでしょうか?

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

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

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

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

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

guest

回答2

0

やり方はいろいろあると思いますが、単純な設定なら以下が簡単です。

  1. 設定をまとめて管理するクラスを作っておき、アプリは常に1つそのインスタンスを持っておく。
  2. 設定を開いたときにそのインスタンスのコピーを作成する。
  3. 各ユーザーコントロールはコピーしたインスタンスを共有してコントロールの値が変更されたら即時設定クラスに反映していく。
  4. 保存を押したときにアプリが持っている設定クラスのインスタンスを入れ替えて変更された値を反映する。

これだとDisposeでの処理とかそもそも必要ないかと。
ですので、構造体よりクラスの方がいいと思います。

投稿2017/09/08 14:50

編集2017/09/08 14:52
toki_td

総合スコア2850

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

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

piglet

2017/09/09 13:24

そうですね。この方法も考えたのですが ParentChangedイベントを使えばうまくいきました
guest

0

自己解決

ParentChanged のイベントで上手くいきました

private void ***_ParentChanged(object sender, EventArgs e) { if(this.Parent == null) { // パネルが変わると親コントロールはnullになる // ここに保存処理を書く } }

呼び出すしがわで
controls.remove()をすると上記が呼ばれ、親コントロールがいないと保存処理ができます

投稿2017/09/09 13:22

piglet

総合スコア47

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問