[英]Application setting is not saved
我想將StringDictionary
保存到“應用程序設置”中,以便在應用程序啟動時用保存的值填充列表框lbc_lastCustomersVisited
。
這是我的應用程序設置(XML格式):
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Wibe_EFI.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="ApplicationSkinName" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="LastTimeWibeDataObtained" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="LastVisitedCustomer" Type="System.Collections.Specialized.StringDictionary" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
在我的表單中,我得到了StringDictionary
局部變量:
public partial class MainForm : XtraForm
{
private StringDictionary lastVisitedCustomers = new StringDictionary();
[...]
}
這是我填寫StringDictionary
局部變量的方式:
private void btn_selectCustomer_Click(object sender, EventArgs e)
{
DataRowView selectedRow = GetCustomersGridSelectedRow();
lastVisitedCustomers.Add(GetCustomerID(selectedRow), String.Format("{0} - {1}", GetCustomerName(selectedRow), GetCustomerCity(selectedRow)));
}
( StringDictionary
已成功填充 )
在FormClosing
,我保存設置:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
Settings.Default["ApplicationSkinName"] = UserLookAndFeel.Default.SkinName;
Settings.Default.LastVisitedCustomer = lastVisitedCustomers;
Settings.Default.Save();
}
設置ApplicationSkinName
已成功保存,但lastVisitedCustomer StringDictionary
未成功保存。 因為當我在應用程序啟動時加載設置時, Settings.Default.LastVisitedCustomer
為null
。
這是我如何加載有關應用程序外觀的設置的方法(有效):
public MainForm()
{
InitializeComponent();
InitSkinGallery();
UserLookAndFeel.Default.SkinName = Settings.Default["ApplicationSkinName"].ToString();
}
但是由於NullReferenceException
我無法在此處加載StringDictionnary
。
所以我在這里加載:
private void MainForm_Load(object sender, EventArgs e)
{
_mySqlCeEngine = new MySqlCeEngine(this);
ShowHomePanel();
LoadLastVisitedCustomers();
}
private void LoadLastVisitedCustomers()
{
if (Settings.Default.LastVisitedCustomer.Count > 0)
{
lastVisitedCustomers = Settings.Default.LastVisitedCustomer;
}
lbc_lastCustomersVisited.DataSource = new BindingSource(lastVisitedCustomers, null);
lbc_lastCustomersVisited.DisplayMember = "Value";
lbc_lastCustomersVisited.ValueMember = "Key";
}
但是目前, Settings.Default.LastVisitedCustomer
為null,我不明白為什么。 我嘗試了一些不使用局部變量的方法,而直接從Settings.Default.LastVisitedCustomer
讀取/寫入,但遇到了同樣的問題。
謝謝,
地獄貓
編輯 :添加了完整的Settings.settings
文件(XML視圖)
如果您想嘗試,我嘗試通過創建一個新的formapplication來產生錯誤消息:
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
test.Text = (string)Settings.Default["lastCustomers"];
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Settings.Default["lastCustomers"] = test.Text;
Settings.Default.Save();
}
}
}
在此示例中,代碼有效。 只需創建一個新的Form-Application並在其中添加一個名為test
的文本框即可。 每次關閉程序並重新啟動它時,寫入文本框的字符串將被保存並重新加載到test.Text
。
具體而言,您的構造函數應如下所示:(可能的解決方案)
public MainForm()
{
InitializeComponent();
InitSkinGallery();
UserLookAndFeel.Default.SkinName = Settings.Default["ApplicationSkinName"].ToString();
lastVisitedCustomers = (StringDictionary)Settings.Default["LastVisitedCustomer"];
}
之后,以與加載設置相同的方式保存設置:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
Settings.Default["ApplicationSkinName"] = UserLookAndFeel.Default.SkinName;
Settings.Default["LastVisitedCustomer"] = lastVisitedCustomers;
Settings.Default.Save();
}
這應該可以解決您的問題!
編輯哦,當然,您的加載函數看上去與以下不同:
private void MainForm_Load(object sender, EventArgs e)
{
_mySqlCeEngine = new MySqlCeEngine(this);
ShowHomePanel();
LoadLastVisitedCustomers();
}
private void LoadLastVisitedCustomers()
{
lbc_lastCustomersVisited.DataSource = new BindingSource(lastVisitedCustomers, null);
lbc_lastCustomersVisited.DisplayMember = "Value";
lbc_lastCustomersVisited.ValueMember = "Key";
}
我找不到在應用程序設置中存儲Dictionary
任何解決方案,因此我決定處理一個string
並將其拆分:
public partial class MainForm : XtraForm
{
private Dictionary<string, string> lastVisitedCustomers;
public MainForm()
{
InitializeComponent();
InitSkinGallery();
UserLookAndFeel.Default.SkinName = Settings.Default["ApplicationSkinName"].ToString();
lastVisitedCustomers = StringToDictionary(Settings.Default["LastVisitedCustomer"].ToString());
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
Settings.Default["ApplicationSkinName"] = UserLookAndFeel.Default.SkinName;
Settings.Default["LastVisitedCustomer"] = DictionaryToString(lastVisitedCustomers);
Settings.Default.Save();
}
#region Dictionary management
private string DictionaryToString(Dictionary<string, string> dic)
{
if (dic.Count == 0)
{
return string.Empty;
}
else
{
string dicString = string.Empty;
int i = 0;
foreach (KeyValuePair<string, string> entry in dic)
{
if (i == 0)
{
dicString = String.Format("{0} ## {1}", entry.Key, entry.Value);
i++;
}
else
{
dicString += String.Format(" -- {0} ## {1}", entry.Key, entry.Value);
}
}
return dicString;
}
}
private Dictionary<string, string> StringToDictionary(string str)
{
Dictionary<string, string> dic = new Dictionary<string,string>();
if (String.IsNullOrEmpty(str))
{
return dic;
}
else
{
string[] entries = Regex.Split(str, " -- ");
foreach (string entry in entries)
{
string[] kvp = Regex.Split(entry, " ## ");
dic.Add(kvp[0], kvp[1]);
}
return dic;
}
}
}
#endregion
目前,它可以工作。
我希望它能對我所處的環境有所幫助。
注意 :您可能必須修改我的字典方法,才能處理所有例外情況。 但我認為現在還可以。
對不起,任何英語錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.