14

私のプロジェクトでは、プロジェクト プロパティの [設定] から追加した設定があります。

app.config ファイルを直接編集しても、実際には設定値が更新されないように見えることがすぐにわかりました。変更を加えてから再コンパイルするときに、プロジェクトのプロパティを表示する必要があるようです。

  • 私は疑問に思っています...プロジェクトのカスタマイズ可能な設定を処理するための最良かつ最も簡単な方法は何ですか-これは.Netがそれを処理する方法を考えると非常に簡単だと思いました...残念です。

  • これを処理するために、 AppSettingsApplicationSettings、またはUserSettingsのいずれかの設定を使用することは可能ですか?

自分の設定をカスタム構成ファイルに書き込んで、自分で処理する方が良いですか?

今...私は最速の解決策を探しています!

私の環境は C#、.Net 3.5、Visual Studio 2008 です。

アップデート

私は次のことをしようとしています:

    protected override void Save()
    {
        Properties.Settings.Default.EmailDisplayName = this.ddEmailDisplayName.Text;
        Properties.Settings.Default.Save();
    }

コンパイル時に読み取り専用エラーが発生します。

4

9 に答える 9

12

これはばかげています...そして、みんなの時間を無駄にしてしまったことをお詫びしなければならないと思います! しかし、スコープをアプリケーションではなくユーザーに設定するだけでよいようで、新しい値を書き込むことができます。

于 2009-01-23T14:44:49.567 に答える
6

私もこの必要性を解決しようとしましたが、共有したい素敵なきれいな ConsoleApplication ができました: (App.config)

表示される内容は次のとおりです。

  1. すべての AppSetting プロパティを読み取る方法
  2. 新しいプロパティを挿入する方法
  3. プロパティを削除する方法
  4. プロパティを更新する方法

楽しむ!

    public void UpdateProperty(string key, string value)
    {
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        KeyValueConfigurationCollection appSettings = config.AppSettings.Settings;


        // update SaveBeforeExit
        config.AppSettings.Settings[key].Value = value;
        Console.Write("...Configuration updated: key "+key+", value: "+value+"...");

        //save the file
        config.Save(ConfigurationSaveMode.Modified);
        Console.Write("...saved Configuration...");
        //relaod the section you modified
        ConfigurationManager.RefreshSection(config.AppSettings.SectionInformation.Name);
        Console.Write("...Configuration Section refreshed...");
    }

    public void ReadAppSettingsProperty()
    {
        try
        {
            var section = ConfigurationManager.GetSection("applicationSettings");

            // Get the AppSettings section.
            NameValueCollection appSettings = ConfigurationManager.AppSettings;

            // Get the AppSettings section elements.
            Console.WriteLine();
            Console.WriteLine("Using AppSettings property.");
            Console.WriteLine("Application settings:");

            if (appSettings.Count == 0)
            {
            Console.WriteLine("[ReadAppSettings: {0}]", "AppSettings is empty Use GetSection command first.");
            }
            for (int i = 0; i < appSettings.Count; i++)
            {
                Console.WriteLine("#{0} Key: {1} Value: {2}",
                i, appSettings.GetKey(i), appSettings[i]);
            }
        }
        catch (ConfigurationErrorsException e)
        {
            Console.WriteLine("[ReadAppSettings: {0}]", e.ToString());
        }

    }


    public void updateAppSettingProperty(string key, string value)
    {
        // Get the application configuration file.
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        string sectionName = "appSettings";


        config.AppSettings.Settings.Remove(key);
        config.AppSettings.Settings.Add(key, value);

        SaveConfigFile(config);
    }

    public void insertAppSettingProperty(string key, string value)
    {
        // Get the application configuration file.
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        string sectionName = "appSettings";

        config.AppSettings.Settings.Add(key, value);

        SaveConfigFile(config);
    }

    public void deleteAppSettingProperty(string key)
    {
        // Get the application configuration file.
        System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        config.AppSettings.Settings.Remove(key);

        SaveConfigFile(config);
    }

    private static void SaveConfigFile(System.Configuration.Configuration config)
    {
        string sectionName = "appSettings";

        // Save the configuration file.
        config.Save(ConfigurationSaveMode.Modified);

        // Force a reload of the changed section. This  
        // makes the new values available for reading.
        ConfigurationManager.RefreshSection(sectionName);

        // Get the AppSettings section.
        AppSettingsSection appSettingSection =
          (AppSettingsSection)config.GetSection(sectionName);

        Console.WriteLine();
        Console.WriteLine("Using GetSection(string).");
        Console.WriteLine("AppSettings section:");
        Console.WriteLine(appSettingSection.SectionInformation.GetRawXml());
    }    
}

構成ファイルは次のようになります。

<configuration>
<configSections>
</configSections>
<appSettings>
    <add key="aNewKey1" value="aNewValue1" />
</appSettings>

さて、このソリューションでは AppSettings に問題はありませんでした! 楽しむ... ;-) !

于 2013-01-17T14:54:01.577 に答える
4

アプリをデバッグ モードで実行していることに気付くまで、同じ問題が発生していたため、新しい appSetting のキーが [applicationName] に書き込まれていました。vshost.exe.configファイル。

また、この vshost.exe.config ファイルは、アプリが閉じられると新しいキーを保持しません。[applicationName] に戻ります。exe.configファイルの内容。

デバッガーの外でテストしましたが、ここや他の場所で構成 appSetting キーを追加するさまざまな方法が正常に機能します。新しいキーが [applicationName] に追加されます。exe.config .

于 2011-03-25T21:51:13.797 に答える
3
 System.Configuration.Configuration config =ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        config.AppSettings.Settings["oldPlace"].Value = "3";     
        config.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("appSettings");

このコードで試してみてください、簡単です。

担当: Erick Siliezar

于 2009-08-17T16:03:13.107 に答える
2

コードで Settings クラスをどのように参照していますか? デフォルトのインスタンスを使用していますか、それとも新しい設定オブジェクトを作成していますか? デフォルトのインスタンスは、プロパティが開かれたときにのみ構成ファイルから再読み取りされる、デザイナーが生成した値を使用すると思います。新しいオブジェクトを作成する場合、 app.config ファイルに設定が存在しない場合を除き、値はデザイナーが生成した属性からではなく、構成ファイル自体から直接読み取られると思います。

通常、私の設定はアプリケーションではなく、ライブラリにあります。プロパティ ファイルに有効なデフォルトを設定しました。次に、アプリケーションの構成 (必要に応じて web.config または app.config のいずれか) に適切な構成セクション (ライブラリ app.config ファイルから取得および変更) を追加することで、これらをオーバーライドできます。

使用:

 Settings configuration = new Settings();
 string mySetting = configuration.MySetting;

それ以外の:

 string mySetting = Settings.Default.MySetting;

私にとって鍵です。

于 2009-01-23T14:28:44.903 に答える
1

これを試して:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <configSections>
   <!--- ->
  </configSections>

  <userSettings>
   <Properties.Settings>
      <setting name="MainFormSize" serializeAs="String">
        <value>
1022, 732</value>
      </setting>
   <Properties.Settings>
  </userSettings>

  <appSettings>
    <add key="TrilWareMode" value="-1" />
    <add key="OptionsPortNumber" value="1107" />
  </appSettings>

</configuration>

App.Configファイルからの値の読み取り:

//This method will read the value of the OptionsPortNumber in the
//above app.config file.
private int LoadConfigData ()
    {
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        // AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
        // points to the config file.   
        doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
        int smartRefreshPortNumber = 0;
        foreach (XmlNode node in doc.ChildNodes.Item(1))
        {
        //Searching for the node “”
            if (node.LocalName == "appSettings")
            {
                 smartPortNumber =Convert.ToInt32(node.ChildNodes.Item(1).Attributes[1].Value);
            }
        }
        Return smartPortNumber;
    }

App.configの値を更新します。

//This method will read the value of the OptionsPortNumber in the
//above app.config file.
private void UpdateConfigData()
    {
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        doc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);


        //Looping through all nodes.
        foreach (XmlNode node in doc.ChildNodes.Item(1))
        {
        //Searching for the node “”
            if (node.LocalName == "appSettings")
            {
                if (!dynamicRefreshCheckBox.Checked)
                {
                    node.ChildNodes.Item(1).Attributes[1].Value = this.portNumberTextBox.Text;
                }
                else
                {
                    node.ChildNodes.Item(1).Attributes[1].Value = Convert.ToString(0);
                }
            }
        }
        //Saving the Updated values in App.config File.Here updating the config
        //file in the same path.
        doc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
    }
于 2009-12-31T07:30:29.113 に答える
0

あなたの答えはおそらくここにあります: Windows フォーム C# アプリケーションで構成ファイルを使用する最も簡単な方法

于 2009-01-23T14:29:44.183 に答える