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

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

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

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

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

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

Q&A

解決済

2回答

8346閲覧

アプリケーション設定の動的な拡張

Zuishin

総合スコア28656

C#

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

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

Visual Studio

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

0グッド

0クリップ

投稿2016/07/01 00:14

ソリューションエクスプローラーでプロジェクトの Properties を開き、その中の Settings.settings を編集することでアプリケーション設定の項目を作成することができます。
例えば、名前欄を Greet とし、型を string 値を Hello とすると、プログラム中からは

C#

1Console.WriteLine(Properties.Settings.Default.Greet);

で Hello と表示されます。
もしくは

C#

1Propeties.Settings.Default["Greet"]

という表記もできます。
ここで、事前に Settings.settings を編集して Greet を作ってから

C#

1Properties.Settings.Default["Greet"] = "Hello";

とすることはできます。しかし同じことを Settings.settings の編集なしにやろうとしてもできません。
System.Configuration.SettingsPropertyNotFound 例外が発生します。

事前の編集なしにプログラム中から項目を増やすことは可能でしょうか?

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

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

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

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

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

guest

回答2

0

元になっているxmlを読み込んで書き換えてインスタンスを再生成すれば
もしかしたら[]でアクセスできるかもしれないですが

そんな方法を取るぐらいなら別の方法で保存したほうがいい気がします。

投稿2016/07/01 02:41

編集2016/07/01 02:42
ozwk

総合スコア13512

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

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

Zuishin

2016/07/01 02:50

ありがとうございます。 確かに元のファイルを読めばいいんですが、他に設定を読み書きしている部分と競合するであろうと言うのと、おっしゃる通り独自に保存した方がいいというのがあります。
guest

0

ベストアンサー

ちょっとそれますが、System.Configuration.Configurationを使用したらいかがでしょうか。
おなじことができると思いますが。
これは、プロジェクトに作成されるapp.configを読んだり・書いたりできますので。

C#

1 //Configurationの作成 2 //ConfigurationUserLevel.Noneでアプリケーション構成ファイルを開く 3 System.Configuration.Configuration config = 4 System.Configuration.ConfigurationManager.OpenExeConfiguration( 5 System.Configuration.ConfigurationUserLevel.None); 6 7 //------------------------------------------------------------------- 8 //構成ファイルに新しい値を追加する 9 //------------------------------------------------------------------- 10 config.AppSettings.Settings["test1"].Value = "hoge1"; 11 config.AppSettings.Settings["test2"].Value = "hoge2"; 12 13 //------------------------------------------------------------------- 14 //構成ファイルの値を変更する 15 //------------------------------------------------------------------- 16 config.AppSettings.Settings["test1"].Value = "sample1"; 17 config.AppSettings.Settings["test2"].Value = "sample2"; 18 19 // 保存 20 config.Save(ConfigurationSaveMode.Full); 21

投稿2016/07/01 02:36

red_bb

総合スコア71

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

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

Zuishin

2016/07/01 02:48

ありがとうございます。 そうですね。その方法も考えたのですが、新しい値を追加しようとすると、NullReferenceException が発生します。 ここで言うと config も AppSettings も Settings も null ではありません。 config.AppSettings.Settings の Count は 0 です。
red_bb

2016/07/01 04:17

そうなんですか。 ちなみに、Consoleアプリでしょうか? こちらでは、WindowsFormで作成し、手順通りで config.AppSettings.Settings["test1"].Value = "hoge1"; を設定できましたが。。
Zuishin

2016/07/01 04:25

たびたびありがとうございます。 私が自分で試した時はコンソールアプリでしたが、 今回は頂いたソースそのまま両方で試してみました。 test1 が作成されていれば大丈夫でしたが、作成されていない場合は NullReferenceException が発生しました。 config.AppSettings.Settings["test1"].Value = "hoge1"; とする代わりに config.AppSettings.Settings.Add("test1", "hoge1"); とすると、そこで例外は起きませんが、代わりに保存するときに例外が発生します。
Zuishin

2016/07/01 04:26

しかし、できている方がいらっしゃるということは、私のほうで何か別のところを変えればできる可能性があるということですね。 そのあたりも含めて考えてみます。
red_bb

2016/07/01 05:03 編集

Consoleアプリだと失敗したので、以下のように変更しました。 class Program { static void Main(string[] args) { System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration( System.Configuration.ConfigurationUserLevel.None); //------------------------------------------------------------------- //構成ファイルに新しい値を追加する //------------------------------------------------------------------- config.AppSettings.Settings.Add("test2", "hoge2"); config.AppSettings.Settings.Add("test3", "hoge3"); config.AppSettings.Settings.Add("test4", "hoge4"); config.AppSettings.Settings.Add("test5", "hoge5"); config.AppSettings.Settings["test2"].Value = "hogehoge"; config.Save(); } } これでどうでしょうか? あと、app.confを http://dobon.net/vb/dotnet/programing/appconfigfile.html で同じような設定が必要かと。
Zuishin

2016/07/01 05:44

ご紹介頂いたページのようにあらかじめ用意しておけばできますが、私がお聞きしているのは、それをしなくてもできないかということなのですが…
red_bb

2016/07/01 06:01 編集

すいません。 一応、設定は必要ですが、新規のプロパティは追加できるようになります。 新規のプロパティが追加できないとの意図かと思ったので、 そのように書かせていただきました。。 上記ですと、"test2", "test3"はapp.configにない状態になります。 上記app.configの状態 -------------------------------------------- <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="Application Name" value="ConTest" /> <add key="Application Version" value="1.0.0.0" /> </appSettings> </configuration> ----------------------------------------------- これには、"test2", "test3"ありませんが、上記の手順でエラーは出ずに新規に登録できます。また、Saveで同じく保存もされます。 もし、この設定が嫌であれば、ozwkさんのおっしゃるようにXMLをアクセスして取得するようにしたほうがいいかと思われます。。
Zuishin

2016/07/01 06:18 編集

ありがとうございます。 同様にしたら保存時の例外はなくなりました。 しかし、再起動して今度は Add() せず保存した値を読みだそうとすると例外が発生します。 うちでは書き込めていないようです。 private System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration( System.Configuration.ConfigurationUserLevel.None); private void button1_Click(object sender, EventArgs e) { config.AppSettings.Settings.Add("test1", "test2"); config.AppSettings.Settings["test1"].Value = "test2"; Debug.WriteLine(config.AppSettings.Settings["test1"].Value); config.Save(ConfigurationSaveMode.Full); } private void button2_Click(object sender, EventArgs e) { Debug.WriteLine(config.AppSettings.Settings["test1"].Value); config.Save(ConfigurationSaveMode.Full); } これで button1 を押すと正常に test2 と出力されます。 再起動して button2 を押すと例外が発生します。
red_bb

2016/07/01 06:28

デバッガから動作させてますか? Visual Studioから起動すると app.conf は xxxx.exe.confを上書きしてしまいます。 ためしに作成されたモジュールをエクスプローラで起動して同じ手順で確認してみてください。
Zuishin

2016/07/01 06:36

盲点でした。上書きされてたんですね。うまくいきました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問