在C#(vs2005)中使用“重置为默认”功能实现“程序选项”对话框的最佳方法是什么?
以下是我的工作方式。
向所有者表单添加一些代码:
if(myDialog.ShowDialog(this)== DialogResult.OK)
{
MySettings.Default.Save();
}
否则
{
MySettings.Default.Reload();
}
在对话框表单的DefaultButtonClick事件中添加以下行:
MySettings.Default.Reset();
注意: Save(),Reload(),Reset()是ApplicationSettingsBase类的常见.Net函数。有关这方面的详细解释可以在http://www.codeproject.com/KB/dotnet/user_settings.aspx看到(感谢BillW的链接)。
此代码运行正常,保存和恢复用户设置没有问题,但“重置为默认”功能与我在许多流行软件中看到的不同。在我的实现中,“重置”无法取消(因为Settings.Default.Reset()无法恢复),但是如果您看到某个热门程序的选项对话框(例如,Windows资源管理器中的“文件夹选项”),则重置可以通过按取消按钮取消。
那么,实现“重置”功能的“传统”方式的最佳和最简单的方法是什么?
更新(可能是最佳答案)
目前我已通过以下方式解决了问题。而不是
MySettings.Default.Reset();
无法恢复,我直接读取默认值:
MySettings.Default.MyBoolValue = bool.Parse((string)MySettings.Default.Properties["MyBoolValue "].DefaultValue);
现在一切都按照我想要的方式工作,但实际上我觉得这段代码有点脏,因为我需要单独为每个变量执行此操作,执行类型转换,等等。如果有人知道更好的简单解决方案,请在此处发布。
答案 0 :(得分:2)
你在做什么会“奏效”,但不是很灵活。
在实践中,我发现将设置值复制到POCO
(普通的旧clr对象)以使其工作最佳,在“重置”时将对象丢弃,在保存时,将值复制回来并保存()
当你进行绑定等时,你会绑定到设置的副本。如果您有多个“设置”设置,这有助于将事情组织起来。
有意义吗?你的计划很好; - )
答案 1 :(得分:1)
这是我的实施方式。
[SettingsProvider(typeof(FileSettingsProvider))]
internal sealed partial class Settings: ApplicationSettingsBase {
private static Settings defaultInstance = (Settings)ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
public T GetDefaultValue<T>(string setting) {
try {
if (typeof(T) != typeof(string))
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString((string)this.Properties[setting].DefaultValue);
else
return (T)this.Properties[setting].DefaultValue;
}
catch {
return default(T);
}
}
[UserScopedSetting()]
[DefaultSettingValue("512")]
public int Delay {
get {
return ((int)(this["Delay"]));
}
set {
this["Delay"] = value;
}
}
}
这种方法的用法:
int d = Settings.Default.GetDefaultValue<int>("Delay");
我创建了类设置,因为我想存储在同一个项目中实现的类型,并且有机会将我自己的SettingsProvider分配给整个类而不是每个属性。所以我在班上包含了方法GetDefaultValue。但是,如果您使用的是设计器生成的类设置,则无法阻止使用方法。只需在其他地方实现它:
public T GetDefaultValue<T>(string setting) {
try {
if (typeof(T) != typeof(string))
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString((string)Settings.Default.Properties[setting].DefaultValue);
else
return (T)Settings.Default.Properties[setting].DefaultValue;
}
catch {
return default(T);
}
}
答案 2 :(得分:0)
正如@Paul Kohler所提到的,你可以使用DTOs。如果你走那条路,你可能想看看AutoMapper。我自己没有用它,但它看起来很适合你的情况。
另一个选择是获取Rocky Lhotka的Expert C# 2008 Business Objects副本并实现N级撤消。最近一位同事在工作中实施了这项工作(基于2005年版)并且很光滑。