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

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

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

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

Visual Studio

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

4回答

10115閲覧

Visual Studioで独自クラスを設定に保存する方法が分かりません。C# WPF

gucha

総合スコア55

C#

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

Visual Studio

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/06/07 17:51

ソフトの設定などをSettings.settingsで作った設定を利用して読み書きするところまではできたのですが、種類に自作したクラスを設定する方法が分かりません。

イメージ説明

こちらで紹介されているように設定したつもりなのですが[種類]には作成したクラスが表示されません。
https://dobon.net/vb/dotnet/programing/mysettings.html#section5

試したことは
確認用のプロジェクトを新規作成後、Settings.csに紹介されているコードを追加しただけです。[種類]に追加したLinesが追加されることを期待していたのですが新たに追加されたものはありませんでした。

C#

1namespace testApp.Properties { 2 3 // このクラスでは設定クラスでの特定のイベントを処理することができます: 4 // SettingChanging イベントは、設定値が変更される前に発生します。 5 // PropertyChanged イベントは、設定値が変更された後に発生します。 6 // SettingsLoaded イベントは、設定値が読み込まれた後に発生します。 7 // SettingsSaving イベントは、設定値が保存される前に発生します。 8 internal sealed partial class Settings { 9 10 [global::System.Configuration.UserScopedSettingAttribute()] 11 public System.Collections.Generic.List<string> Lines 12 { 13 get 14 { 15 return ((System.Collections.Generic.List<string>)(this["Lines"])); 16 } 17 set 18 { 19 this["Lines"] = value; 20 } 21 } 22 23 public Settings() { 24 25 // // 設定の保存と変更のイベント ハンドラーを追加するには、以下の行のコメントを解除します: 26 // 27 // this.SettingChanging += this.SettingChangingEventHandler; 28 // 29 // this.SettingsSaving += this.SettingsSavingEventHandler; 30 // 31 } 32 33 private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { 34 // SettingChangingEvent イベントを処理するコードをここに追加してください。 35 } 36 37 private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { 38 // SettingsSaving イベントを処理するコードをここに追加してください。 39 } 40 } 41}

Visual Studio 2017でWPFアプリです。
やり方が間違えているのでしょうか?それとも元から期待している内容が実現不可能なのでしょうか?

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

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

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

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

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

guest

回答4

0

こちらの方法は、設定の画面の「種類」を増やす方法ではありません。
Properties.Settings.Default.LinesとList<string>の項目を
追加するコードになります。
要は、デザイナを使用せずに、コードで設定項目を増やしている行為となります。

デザイナ上の「種類」を追加する方法に関しては、私もわかりません。

追記

DLLを作成しての方法ですが、以下のようにしたところ、設定のデザイナ上でも設定でき、プログラム上からも
値の保存ができました。

DLL側

C#

1using System; 2using System.ComponentModel; 3using System.Globalization; 4 5namespace TestDLL 6{ 7 [TypeConverter(typeof(CustomClassConverter))] 8 public class TestClass1 9 { 10 public int Test { get; set; } 11 public string Test2 { get; set; } 12 } 13 14 public class CustomClassConverter : ExpandableObjectConverter 15 { 16 //コンバータがオブジェクトを指定した型に変換できるか 17 //(変換できる時はTrueを返す) 18 public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 19 { 20 if (destinationType == typeof(TestClass1)) 21 return true; 22 return base.CanConvertTo(context, destinationType); 23 } 24 25 //指定した値オブジェクトを、指定した型に変換する 26 public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 27 { 28 if (destinationType == typeof(string) && value is TestClass1) 29 { 30 TestClass1 cc = (TestClass1)value; 31 return cc.Test.ToString() + "," + cc.Test2; 32 } 33 return base.ConvertTo(context, culture, value, destinationType); 34 } 35 36 //コンバータが特定の型のオブジェクトをコンバータの型に変換できるか 37 //(変換できる時はTrueを返す) 38 //ここでは、String型のオブジェクトなら変換可能とする 39 public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 40 { 41 if (sourceType == typeof(string)) 42 return true; 43 return base.CanConvertFrom(context, sourceType); 44 } 45 46 //指定した値をコンバータの型に変換する 47 public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 48 { 49 if (value is string) 50 { 51 string[] c = value.ToString().Split(new char[]{','},2); 52 TestClass1 cc = new TestClass1(); 53 cc.Test = int.Parse(c[0]); 54 cc.Test2 = c[1]; 55 56 return cc; 57 } 58 return base.ConvertFrom(context, culture, value); 59 } 60 } 61} 62

下図のようにデザイナ上で設定でき
イメージ説明

保存結果はこうなりました。

XML

1 <userSettings> 2 <WindowsFormsApp1.Properties.Settings> 3 <setting name="Test" serializeAs="String"> 4 <value>123,ABC</value> 5 </setting> 6 </WindowsFormsApp1.Properties.Settings> 7 </userSettings>

投稿2018/06/08 01:04

編集2018/06/09 16:13
YAmaGNZ

総合スコア10242

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

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

0

[種類]のドロップダウンリストの一番下に[参照…]が出てませんか?
そこから辿れば選択できると思います。
--- 追記 ---
とりあえずXMLにシリアライズ-デシリアライズする方法はありました。
参照…でMyItemTypeを指定して値にXMLの部分を入れてみてください。

C#

1namespace ClassLibrary1 2{ 3 [XmlRoot("myItemType")] 4 public class MyItemType 5 { 6 [XmlElement("name")] 7 public string Name { get; set; } 8 } 9}

XML

1<?xml version="1.0" encoding="utf-16"?> 2<myItemType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <name>hoge</name> 4</myItemType>

投稿2018/06/08 02:57

編集2018/06/09 04:03
hihijiji

総合スコア4150

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

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

gucha

2018/06/08 10:59

参照から辿りましたが見つかりませんでした。環境の差でしょうか・・・。
g_uo

2018/06/08 12:05

私も確認のため探ったのですがList型は見当たりませんでした。(stringのコレクションクラスはありました) オリジナルのクラスを定義すると見えるかもと思ってやってみましたが、それも追加されないようでした。 私の環境はVS2017です。
hihijiji

2018/06/09 01:48

こちらもVS2017です。 既存のソリューションの場合は[参照…]から辿れますが、新規でプロジェクトを作ったら名前空間すら出てきませんね。 コンパイルやVSの再起動をしただけでは出ないみたいです。 時間があるときに探ってみます。
YAmaGNZ

2018/06/09 02:20

自作DLLにTestClassを作成し、そのDLLを参照した場合に[参照]からTestClassを追加することができました。 ただ、 public class TestClass1 { private int _Test; public int Test { get { return _Test; } set { _Test = value; } } } としか書いてないので、デザインから値の設定はできません。 多分、TypeConverter等の実装が必要なのかと思います。
hihijiji

2018/06/09 04:13

XMLにシリアライズ-デシリアライズする方法を追記しました。
gucha

2018/06/09 15:09

YAmaGNZさん クラスを作るごとにDLLを調整するのは手間がありそうですがこちらの方法があることも知れて良かったです。教えて頂きありがとうございました。   hihijijiさん こちらも別の方法で教えて頂きありがとうございます。
guest

0

ベストアンサー

こんにちは。

Setting.cs ではなく、 Settings.Designer.cs に同様の内容を書いてください。
それによって

csharp

1Properties.Settings.Default.Lines

でアクセスできるようになります。デザイナから設定値をセットできませんから、プログラムで一旦書き込んでおく必要があります。

なお、プロジェクトのプロパティ -> 設定 の画面にはLinesは表示されません。
また、独自のクラスを種類に表示することについては質問者様が示したリンク先にも記載されていません。あくまで__独自のクラスを使うことができる__と言っているだけです。

もし質問の本意が、独自クラスを種類の選択肢に表示させてデザイナから設定値を操作したい、ということであればこの回答は適さないです。申し訳ありません。

投稿2018/06/08 01:19

g_uo

総合スコア212

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

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

gucha

2018/06/09 15:22

皆様から教えて頂いた方法を確認して今回は「元から期待している内容が実現不可能」だったということが理解できました。 partial class Settingsに独自クラスを追加しておくという方法が一番簡単に操作できると思ったのでこちらの回答をベストアンサーとさせていただきます。 次回以降は質問の「目的」をはっきりとさせてから質問するようにします。 皆様ありがとうございました。
guest

0

英語ですが、これ以上の説明はないでしょう。
http://www.blackwasp.co.uk/customappsettings.aspx

投稿2019/03/13 06:21

firstlast

総合スコア138

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問