保存对表单控件的更改?

时间:2015-04-24 21:03:56

标签: c# .net winforms

问题

如何保存“设置”,以便在应用程序关闭后再次使用它们?

当我说设置时,我的意思是表单上控件的不同属性。

最简单,最合适的方法是什么?我读过你可以保存到系统注册表或xml文件?

背景

我有一个表格,它在表格中创建一个行,该行根据设置或更改的控件而变化。

我希望能够保存不同的配置并将它们显示在组合框中以供重复使用。

实施例

  1. 最终用户填写所有文本框并勾选复选框。
  2. 然后他们点击添加到收藏夹
  3. 他们添加了一个喜欢的名字并保存
  4. 然后在收藏夹组合框中永久显示保存。
  5. 我的表格

    enter image description here

3 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。但是在所有这些选项中,您需要在某处存储用户选择。您可以将其存储在

  1. 数据库表,将设置与唯一用户ID相关联,例如LoginID
  2. 首选项XML文件:Refer this
  3. 作为项目中的设置:Refer this
  4. 作为注册表项:Refer this
  5. INI文件
  6. 您可能需要查看Persisting Application Settings in the .NET Framework

答案 1 :(得分:1)

这取决于您的应用程序及其用途及其架构。

有多种选择:

  1. 您可以将其保存在数据库中。 当有很多设置并且在多用户平台中特别好时,此选项很好。如果这是客户端服务器应用程序,由于这个原因,这也可能是优选的。如果你想保持这种简单,并且不要看到复杂/非常多的用户设置,这可能不是最好的选择。

  2. 您可以将其保存在平面文件中。此选项与第一个选项类似,但在您的应用程序更独立和/或您在服务器上没有任何其他好处的情况下可能更好。

  3. 您可以将它们存储在“应用程序设置”中。这里有一个很好的答案:https://msdn.microsoft.com/en-us/library/0zszyc6e%28v=vs.110%29.aspx

  4. 要考虑的另一件事是您要如何加载这些设置。对于Windows窗体开发,具有定义布局和绑定到这些类的类可能很有用。因此,您可能希望将此数据存储在XML中,这些数据可以直接轻松地序列化为定义表单形状的类。您可以将该XML真正存储在任何位置:本地或数据库中的服务器上。

答案 2 :(得分:1)

您可以保存数据的一种方法是将其写入HKCU节点下的注册表。这样,即使应用程序位于同一台计算机上,应用程序的不同用户也将拥有自己的设置。它还使文件系统更清洁,并且不需要数据库。但缺点是收藏夹只能存放在机器上,并且不会在设备上与用户一起漫游。

实现此方法的一种方法是将表单设置包装在知道如何从注册表中保存和加载值的类中。这与注册表助手类一起,可以很容易地添加"收藏夹"表单的功能。

例如,您可以首先创建一个Registry Helper类,它将读取和写入设置到HKCU节点(因此这些设置特定于登录用户):

public class RegHelper
{
    private static readonly RegistryKey Root = Registry.CurrentUser
        .CreateSubKey(@"Software\CompanyName\ApplicationName");

    private readonly RegistryKey _thisKey = Root;

    public RegHelper() { }

    public RegHelper(string favoriteKey)
    {
        _thisKey = Root.CreateSubKey(favoriteKey);
    }

    public List<string> GetSubKeys()
    {
        return _thisKey.GetSubKeyNames().ToList();
    }

    public void SetProperty(string propertyName, string value)
    {
        _thisKey.SetValue(propertyName, value, RegistryValueKind.String);
    }

    public void SetProperty(string propertyName, bool value)
    {
        SetProperty(propertyName, value.ToString());
    }

    public string GetProperty(string propertyName)
    {
        return GetProperty(propertyName, string.Empty);
    }

    public string GetProperty(string propertyName, string defaultValue)
    {
        return _thisKey.GetValue(propertyName, defaultValue).ToString();
    }

    public bool GetPropertyAsBool(string propertyName)
    {
        return bool.Parse(GetProperty(propertyName, default(bool).ToString()));
    }
}

然后,您可以将表单的字段包装到一个类中,该类不仅具有与表单字段匹配的属性,还具有将值保存到注册表的方法以及一些用于加载所有收藏夹或特定命名的静态方法喜爱。例如:

public class Favorite
{
    public string Name { get; private set; }
    public string Notes { get; set; }
    public bool NotesFromPlanner { get; set; }
    public string Project { get; set; }
    public string DbLocation { get; set; }
    public string AssesmentToolVersion { get; set; }
    public string ProjectCodes { get; set; }
    public bool StraightToNew { get; set; }

    public Favorite(string name)
    {
        this.Name = name;
    }

    public void Save()
    {
        var reg = new RegHelper(this.Name);
        reg.SetProperty("Name", Name);
        reg.SetProperty("Notes", Notes);
        reg.SetProperty("NotesFromPlanner", NotesFromPlanner);
        reg.SetProperty("Project", Project);
        reg.SetProperty("DbLocation", DbLocation);
        reg.SetProperty("AssesmentToolVersion", AssesmentToolVersion);
        reg.SetProperty("ProjectCodes", ProjectCodes);
        reg.SetProperty("StraightToNew", StraightToNew);
    }

    public static Favorite GetFavorite(string favoriteName)
    {
        var reg = new RegHelper(favoriteName);
        return new Favorite(favoriteName)
        {
            Notes = reg.GetProperty("Notes"),
            NotesFromPlanner = reg.GetPropertyAsBool("NotesFromPlanner"),
            Project = reg.GetProperty("Project"),
            DbLocation = reg.GetProperty("DbLocation"),
            AssesmentToolVersion = reg.GetProperty("AssesmentToolVersion"),
            ProjectCodes = reg.GetProperty("ProjectCodes"),
            StraightToNew = reg.GetPropertyAsBool("StraightToNew"),
        };
    }

    public static List<Favorite> GetFavorites()
    {
        return new RegHelper().GetSubKeys().Select(GetFavorite).ToList();
    }

    public override string ToString()
    {
        return this.Name;
    }
}

然后,您可以使用收藏夹类填充收藏夹下拉列表:

private void Form1_Load(object sender, EventArgs e)
{
    // Get all saved favorites and load them up in the combo box
    foreach (var favorite in Favorite.GetFavorites())
    {
        cboFavorites.Items.Add(favorite);
    }
}

现在,当从组合框中挑选收藏夹时,我们希望使用详细信息填充表单:

private void cboFavorites_SelectedIndexChanged(object sender, EventArgs e)
{
    var favorite = (Favorite) cboFavorites.SelectedItem;

    txtNotes.Text = favorite.Notes;
    txtAssetToolVersion.Text = favorite.AssesmentToolVersion;
    txtDbLocation.Text = favorite.DbLocation;
    chkNotesFromPlanner.Checked = favorite.NotesFromPlanner;
    txtProjectCodes.Text = favorite.ProjectCodes;
    cboProjects.Text = favorite.Project;
    chkStraightToNew.Checked = favorite.StraightToNew;
}

当有人点击&#34;保存收藏夹&#34;时,我们希望将最喜欢的详细信息添加(或更新)到注册表中:

private void btnAddFavorite_Click(object sender, EventArgs e)
{
    string favoriteName = cboFavorites.Text;

    if (string.IsNullOrEmpty(favoriteName))
    {
        MessageBox.Show("Please type a name for the favorite in the Favorites box.");
        return;
    }

    var favorite = new Favorite(favoriteName)
    {
        Notes = txtNotes.Text,
        AssesmentToolVersion = txtAssetToolVersion.Text,
        DbLocation = txtDbLocation.Text,
        NotesFromPlanner = chkNotesFromPlanner.Checked,
        ProjectCodes = txtProjectCodes.Text,
        Project = cboProjects.Text,
        StraightToNew = chkStraightToNew.Checked
    };

    favorite.Save();

    // When saving a favorite, add it to the combo box
    // (remove the old one first if it already existed)
    var existingFav = cboFavorites.Items.Cast<Favorite>()
        .FirstOrDefault(fav => fav.Name == favoriteName);
    if (existingFav != null)
    {
        cboFavorites.Items.Remove(existingFav);
    }

    cboFavorites.Items.Add(favorite);
    cboFavorites.Text = favoriteName;
}

如果您想要使用注册表路径,这应该足以让您入门。