具有“重置”功能的“程序选项”对话框 - 最佳实践

时间:2010-02-19 02:04:27

标签: c# visual-studio-2005 settings

在C#(vs2005)中使用“重置为默认”功能实现“程序选项”对话框的最佳方法是什么?

以下是我的工作方式。

  1. 创建一个对话框表单并向其添加一些控件(如checkBoxes)。还要添加三个按钮:确定,取消,默认。
  2. 创建设置文件并在用户范围中添加一些字段。
  3. 通过Visual Studio属性对话框中的“应用程序设置”属性将对话框控件与相应的设置字段绑定。
  4. 向所有者表单添加一些代码:

    if(myDialog.ShowDialog(this)== DialogResult.OK)
    {
        MySettings.Default.Save();
    }
    否则
    {
        MySettings.Default.Reload();
    }

  5. 在对话框表单的DefaultButtonClick事件中添加以下行:

    MySettings.Default.Reset();

  6.   

    注意: 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);
    

    现在一切都按照我想要的方式工作,但实际上我觉得这段代码有点脏,因为我需要单独为每个变量执行此操作,执行类型转换,等等。如果有人知道更好的简单解决方案,请在此处发布。

3 个答案:

答案 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年版)并且很光滑。