C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

App.configを書き換えるには

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■96329 / inTopicNo.1)  App.configを書き換えるには
  
□投稿者/ から好し (1回)-(2020/11/11(Wed) 16:13:18)
から好し さんの Web サイト

分類:[C#] 

開発環境 visualstudio2019
使用言語  C#Windowsフォーム

現在 App.configのValueを変更しようとしていて躓いています。
変更は、プログラム(こちらにもKeyとValueがある)から行いたく、App.configのKeyとプログラム側にあるKeyが一致したら
App.configのValueをプログラム側のValueにしたいのですが
foreach (string key in  System.Configuration.ConfigurationManager.AppSettings.AllKeys)
 {
	string value = ConfigurationManager.AppSettings[key];
	System.Diagnostics.Trace.WriteLine(key + value);
	Debug.WriteLine(key+value);
 }
でcfgファイルを読み込めるので
上記のforeachの中に
if(key==プログラムのキー)
   {
         value =プログラムのValue;
    }
としたら、書き換わるのかと思いましたが
そもそもifにすら入りません。
App.configとプログラムとそれぞれに一致するkeyがあるのは確認済みです。
どうしたら書き換えることが出来るでしょうか。
ご教示お願い致します。

引用返信 編集キー/
■96330 / inTopicNo.2)  Re[1]: App.configを書き換えるには
□投稿者/ WebSurfer (2157回)-(2020/11/11(Wed) 16:45:19)
No96329 (から好し さん) に返信

Settings.settings ファイルを使って当該項目のスコープをユーザーにすれば、その項目は
プログラムで書き換えることができますが、そういう方法でいかがですか?

使い方は WPF の例ですが以下の記事を見てください。Windows Forms でも同じです。

http://yohshiy.blog.fc2.com/blog-entry-253.html
Settings を使った WPF でのアプリケーション設定の保存 (ウィンドウの表示位置、サイズの保存)

ただし、保存場所は C:\Users\<ユーザー名>\AppData\Local\<アプリケーション名>\user.config
になります。詳しくは以下の記事を見てください。

構成ファイルの保存場所
http://surferonwww.info/BlogEngine/post/2019/09/01/where-are-configuration-files.aspx
引用返信 編集キー/
■96343 / inTopicNo.3)  Re[2]: App.configを書き換えるには
□投稿者/ ぶなっぷ (256回)-(2020/11/12(Thu) 13:27:26)
2020/11/12(Thu) 13:43:44 編集(投稿者)

から好し さん

以下のコードが、質問内容に関係なく駄目なことは理解しておいたほうがいいです。
> string value = ConfigurationManager.AppSettings[key];
> value =プログラムのValue;

これって何を「プログラムのValue」に書き換えていますか?
value変数の値ですよ。それ以外は何も書き換えていません。
書き換えるには、
ConfigurationManager.AppSettings[key] = プログラムのValue;
です。
ただし、これでもメモリ中の値を変えただけです。

たぶん、書き換わってほしいのは、XMLファイルですよね?
であれば、書き換えた値をXMLファイルに保存しないとだめです。

また、ConfigurationManager.AppSettings というのはMSDNを読むと以下のように
書いてあります。
「現在のアプリケーションの既定の構成のオブジェクトの内容」

つまり、これはconfigファイルの規定値(デフォルト値)です。
デフォルト値なので変更することはないはずです。
※ ファイルでいうと、「App.config」の内容になります。

実際にexeファイル(実行ファイル)を起動した際に読み書きされるのは、exeファイル
と同一フォルダにある [アプリケーション名].exe.configの方になります。

こちらであれば、以下のコードで書き込みできます。
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings[key].Value = プログラムのValue;
config.Save();

foreachで他のキーまでループする必要はないです。
引用返信 編集キー/
■96345 / inTopicNo.4)  Re[3]: App.configを書き換えるには
□投稿者/ ぶなっぷ (257回)-(2020/11/12(Thu) 13:59:14)
2020/11/12(Thu) 14:00:02 編集(投稿者)

参考までに、

> var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
> config.AppSettings.Settings[key].Value = プログラムのValue;
> config.Save();

において、
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
string value = config.AppSettings.Settings[key].Value;
value = プログラムのValue;
config.Save();
としても書き換わらないのは先に述べたとおりです。

でも、以下なら書き換わります。
var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ref string value = config.AppSettings.Settings[key].Value;
value = プログラムのValue;
config.Save();

refが付くか付かないかだけです。
違いが分かるようになってくださいね。

なお、ref付きの方は「参照ローカル変数」と言って、最近、許可された書き方です。
なので、 C#7.0 (Visual Studio 2017)以降でないとコンパイルエラーです。
引用返信 編集キー/
■96347 / inTopicNo.5)  Re[4]: App.configを書き換えるには
□投稿者/ から好し (2回)-(2020/11/12(Thu) 14:28:14)
から好し さんの Web サイト
No96345 (ぶなっぷ さん) に返信
> 2020/11/12(Thu) 14:00:02 編集(投稿者)

ぶなっぷ様、WebSurfer様

有難うございます。
おかげさまで変更できました。

foreachで繰り返したいのは、変更したいのが一つだけではなく複数あるからです。
keyの名前を何か別に配列に入れておいて、[keyの配列[index]]としたいのですが
エラーになりました。
これは、config.AppSettings.Settings["A"].Value = "vvvvvvvuressssss";
のような書き方しか出来ないということでしょうか。




引用返信 編集キー/
■96348 / inTopicNo.6)  Re[4]: App.configを書き換えるには
□投稿者/ 魔界の仮面弁士 (2909回)-(2020/11/12(Thu) 15:28:40)
No96345 (ぶなっぷ さん) に返信
> でも、以下なら書き換わります。
> var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
> ref string value = config.AppSettings.Settings[key].Value;
> value = プログラムのValue;
> config.Save();

参照ローカル変数の場合、代入式の右辺にも ref が必要なのでは…?
(値を渡す側、値を受ける側それぞれに ref 修飾子が必要だったはず)

// ref T x = y; // CS8172: 値を使用して参照渡し変数を初期化することはできません
// T x = ref y; // CS8171: 参照を使用して値渡し変数を初期化することはできません
ref T x = ref y; // これは OK


また、仮に右辺に ref を付けていたとしても、VB と違ってプロパティの参照が認められていないため、
 CS0206: プロパティまたはインデクサーを out または ref のパラメータとして渡すことはできません
になってしまう気がします。(あるいは CS8156 あたりかな)
引用返信 編集キー/
■96349 / inTopicNo.7)  Re[5]: App.configを書き換えるには
□投稿者/ から好し (3回)-(2020/11/12(Thu) 15:33:31)
から好し さんの Web サイト
config.AppSettings.Settings["A"].Value = "vvvvvvvuressssss";の
["A"]ではなく[a[index]]とする件ですが、出来そうです。


引用返信 編集キー/
■96350 / inTopicNo.8)  Re[6]: App.configを書き換えるには
□投稿者/ ぶなっぷ (258回)-(2020/11/12(Thu) 15:54:11)
魔界の仮面弁士さん

失礼しました。
手元に Visual Studio 2017以降の環境がないので、
ネットサーフィンした情報を元に書いていました(^^;)

C++時代の
  int Num = 0;
  int& refNum = Num;
みたいなのとは書き方が違うんですね。

余談ですが、いまだに開発環境は VS2012です。
早く、
  ?.  とか
  nameof()
  switch() case int n when n > 0
  if (obj is string s)
    :
みたいなのを使いたいです。

引用返信 編集キー/
■96352 / inTopicNo.9)  Re[7]: App.configを書き換えるには
□投稿者/ から好し (4回)-(2020/11/12(Thu) 16:41:49)
から好し さんの Web サイト
if(config.AppSettings.Settings[A[index]]== "USA")という風に分岐できないかと思いまいましたが、これをすると
演算子"=="をKeyValueConfigurationElementとstring型のオペランドに適用する事は出来ませんとでました。
やはり地道にやるしかなさそうですね。

引用返信 編集キー/
■96353 / inTopicNo.10)  Re[8]: App.configを書き換えるには
□投稿者/ ぶなっぷ (259回)-(2020/11/12(Thu) 17:24:58)
if(config.AppSettings.Settings[A[index]].Value == "USA")
では?
引用返信 編集キー/
■96363 / inTopicNo.11)  Re[9]: App.configを書き換えるには
□投稿者/ から好し (5回)-(2020/11/16(Mon) 10:04:47)
から好し さんの Web サイト
皆様のご協力で無事に出来ました。
有難うございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ