如何在c#中保存默认上下文设置?

时间:2009-11-20 22:51:46

标签: c# scope save settings default

有人可以告诉我为什么我无法在Settings.Default.Context中保存动态数据吗?

我的代码:

Settings.Default.Context.Add("myKey", "myValue");
Settings.Default.Save();

MessageBox.Show(Settings.Default.Context["myKey"].ToString());<-- This works

如果我不重新加载appi,一切正常。但在重新加载应用程序并仅调用

之后
MessageBox.Show(Settings.Default.Context["myKey"].ToString());<-- error on appi reload

然后我收到类似Object reference not set to an instance of an object.的错误。为什么我无法保存上下文?有什么问题?

我正在使用这种方式保存,因为那时我可以动态添加新的键和值。

3 个答案:

答案 0 :(得分:1)

我认为你不能以这种方式添加新设置,它们只是因为它们是程序本身的资源而被阅读。

您可以执行的操作设置为System.Collections.Specialized.StringCollection,然后向其中添加项目。应用程序关闭后,这些额外的项目仍然存在。

但是你不能做出一个全新的设置并让它仍然存在。

答案 1 :(得分:0)

嗯,什么是设置类型? 无论如何,我认为你错过了.Context ..try写道:

Settings.Default.Context["myKey"].ToString()

问题是该值是User-Scope设置,并且仅在应用程序会话期间持续存在。我认为您需要的应​​用程序范围设置只能在设计时更改(在“项目属性” - >“设置”选项卡中)或通过在应用程序会话之间更改.exe.config文件(http://msdn.microsoft.com/en-us/library/bb397744.aspx

你必须做这样的事情:

    using System.Configuration;

namespace WindowsFormsApplication1
{
  class MySettings : ApplicationSettingsBase
  {
    [UserScopedSetting]
    public string SavedString
    {
      get { return ( string )this["SavedString"]; }
      set { this["SavedString"] = value; }
    }
  } 

  public partial class Form1 : Form
  {
    MySettings m_Settings;

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load( object sender, EventArgs e )
    {
      m_Settings = new MySettings();

      Binding b = new Binding( "Text", m_Settings, "SavedString", true, DataSourceUpdateMode.OnPropertyChanged );
      this.DataBindings.Add( b );
    }

    private void Form1_FormClosing( object sender, FormClosingEventArgs e )
    {
      m_Settings.Save();
    }

    private void button1_Click( object sender, EventArgs e )
    {
      this.Text = "My Text";
    }
  }
}

此应用程序创建一个没有标题的表单,并在中心创建一个按钮。 单击按钮后,.Text(所以标题)会发生变化,并在关闭表单时保存。 重新运行该应用程序,您将使用新标题My Text:)

如果您需要完整的源代码,请告诉我:)

答案 2 :(得分:0)

在对象浏览器中查看:

public override SettingsContext Context {get; }

只读?