【问题标题】:How to auto save and auto load all properties in winforms C#?如何在winforms C#中自动保存和自动加载所有属性?
【发布时间】:2010-01-16 05:03:57
【问题描述】:

如何在关闭时自动保存所有属性winforms并在加载时自动加载所有属性winforms? C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace SControl
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < Controls.Count; i++)
            {
                System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(Controls[i]));
                Stream stream = File.Open("test.xml", FileMode.Create);
                x.Serialize(stream, Controls[i]);
            }
        }
    }
}

【问题讨论】:

  • 您是指窗口大小、位置、模式等属性?

标签: c# winforms


【解决方案1】:

你的问题有点不清楚,但是

如果您需要保存/加载 表单布局,请查看

Windows Forms User Settings in C#

如果您需要保存/加载对象/类,请查看

Load and save objects to XML using serialization

编辑:

这将向您展示如何保留表单属性的某些设置。

Save and Restore Setings of a .NET Form using XML

也可以看看The Application Automation Layer - Using XML To Dynamically Generate GUI Elements--Forms And Controls

所有这些都将引导您朝着需要前进的方向前进。

我认为这里的主要目标是

  • 确定何时保存以及何时保存 加载,以及存储/检索的位置 这些设置。
  • 您是否存储这些设置 用户?在数据库中?在 xml 文件中?
  • 接下来您需要确定哪个 你将成为的属性 保存/恢复每个控件。简单的 位置/尺寸设置可能不会削减 它作为控件将有各种 复杂性(按钮、文本框、 网格视图、列表视图)
  • 现在您需要弄清楚如何 迭代窗体上的所有控件。 按钮、文本框、面板、控件 在 Controls(面板中的控件)中,以及 甚至可能是您的用户控件。这 可以使用递归来完成。
  • 现在您需要决定 xml 文件的结构(如果您选择 使用 xml)。这应该差不多 看起来像一个树结构,因为你 会看表格,它的 控件及其控件,作为 树形结构。

【讨论】:

  • 我喜欢xml对象序列化但是如何保存和加载?
【解决方案2】:

我不知道Form 基类中内置了任何自动方法,但自己添加它并不难。

您可以点击窗口加载和关闭事件以将所有相关属性缓存到后备存储,然后稍后重新加载。

Form.LoadForm.Closing 事件处理程序注册一个事件处理程序。当出现Form.Closing 时,将表单状态保存到文件或数据库中。当Form.Load 出现时,检查是否存在已保存状态,如果存在,则从已保存状态重新加载。

【讨论】:

    【解决方案3】:

    您必须手动编码要保存的属性。

    一种方便的方法是将这些个性化设置保存到Windows Forms Application Settings

    示例代码sn-p:

    //save the winform position and size upon closing
    private void Form1_FormClosed(
       object sender, FormClosedEventArgs e)
    {
        Properties.Settings.Default.FormPosition = this.Location;
        Properties.Settings.Default.FormSize = this.Size;
        Properties.Settings.Default.Save();
    }
    
    //load the winform position and size upon loading
    private void Form1_Load(object sender, EventArgs e)
    {
        this.Size = Properties.Settings.Default.FormSize;
        this.Location = Properties.Settings.Default.FormPosition;
    }
    

    更多参考资料:

    【讨论】:

    • 所有元素?文本框1、文本框2、文本框3 ... ?
    • 可以开始使用函数AutoLoad();可以使用函数 SaveAll() 退出; ?
    • 如果您允许用户对表单控件属性(例如停靠栏、字体等)进行个性化设置,您也可以保存它们,但您必须手动对其进行编码以进行保存和加载。 asstander 为使用序列化的更自动化方法提供了很好的参考,序列化是另一种选择。 AutoLoadExit 可以替换为表单事件 Form.LoadForm.Closing,就像 Ryan Michela 提到的那样。
    【解决方案4】:

    将诸如表单之类的对象转换为可以保存的东西的过程称为序列化。不幸的是,我认为没有一种开箱即用的方式来序列化 WinForm 中的表单。我确实找到了How to Clone/Serialize/Copy & Paste a Windows Forms Control,并且由于表单也是控件,您也许可以使用代码序列化属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多