【问题标题】:Saving the form state then opening it back up in the same state保存表单状态,然后以相同状态打开它
【发布时间】:2013-01-15 00:48:14
【问题描述】:

我在winforms 中有一个小程序,它包含 3 个按钮。到目前为止,该程序允许用户通过单击相应按钮来更改另一个按钮的颜色,而第三个按钮还没有做任何事情。我想做的是让用户保存对表单所做的更改(保存表单状态)。因此,当表单重新打开时,它会以与保存时相同的状态打开。

我希望我清楚自己在追求什么

这是表格的可视化:

如果有帮助的话,我到目前为止的代码:

public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            btnToColor.Text = "";
        }

        int c = 0;
        private void btnColorSwap_Click(object sender, EventArgs e)
        {
            if (c == 0)
            {
                btnToColor.BackColor = Color.Yellow;
                c++;

            }

            else if (c == 1)
            {
                btnToColor.BackColor = Color.YellowGreen;

                c++;
            }

            else if (c == 2)
            {
                btnToColor.BackColor = Color.LimeGreen;

                c = 0;
            }

        }
    }

【问题讨论】:

  • 您想在该过程中保存状态,还是在应用执行之间保存状态?
  • 我不确定这意味着什么老实说我正在寻找一种简单的方法来保存表单的状态
  • 我的意思是,您是否要保存状态,以便下次运行程序时表单恢复到该状态,或者下次您在关闭表单后打开表单(没有结束程序)?
  • 我想保存状态,以便下次我运行程序时表单会回到那个状态

标签: c# winforms visual-studio-2010 savestate


【解决方案1】:

这对您来说可能/可能不会更容易。

首先创建一个类来保存你的状态:

public class MyFormState {
    public string ButtonBackColor { get; set; }
}

现在,使用此对象为您的 Form 声明一个成员:

public partial class Form1 : Form {
    MyFormState state = new MyFormState();

在表单加载时,检查配置是否存在,然后加载它:

private void Form1_Load(object sender, EventArgs e) {
    if (File.Exists("config.xml")) {
        loadConfig();
    }

    button1.BackColor = System.Drawing.ColorTranslator.FromHtml(state.ButtonBackColor);
}

private void loadConfig() {
    XmlSerializer ser = new XmlSerializer(typeof(MyFormState));
    using (FileStream fs = File.OpenRead("config.xml")) {
        state = (MyFormState)ser.Deserialize(fs);
    }
}

当您的表单关闭时.. 保存配置:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
    writeConfig();
}

private void writeConfig() {
    using (StreamWriter sw = new StreamWriter("config.xml")) {
        state.ButtonBackColor = System.Drawing.ColorTranslator.ToHtml(button1.BackColor);
        XmlSerializer ser = new XmlSerializer(typeof(MyFormState));
        ser.Serialize(sw, state);
    }
}

然后您可以将成员添加到您的状态类,它们将被写入 config.xml 文件中。

【讨论】:

  • 该解决方案效果很好。问题是,如果您需要对列表框中的所有项目执行此操作,如果您使用 foreach 循环遍历列表框中的项目并序列化每个项目(您必须这样做),事情会变得非常快。在加载时,您会得到一个很好的异常,说明您已经在文件开头声明了 XML 命名空间之一,并且每次序列化时都在这样做。有什么解决方法吗?
  • 只需将它们存储在字符串列表中。序列化程序会处理它。
【解决方案2】:

如果您查看项目属性页面,您可以添加一个设置文件。

要使用代码中的设置,您可以执行以下操作:

Properties.Settings.Default.SettingName

请记住,这些设置是本地的,需要在每台机器上指定

示例代码:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        Properties.Settings.Default.btn1 = button1.UseVisualStyleBackColor ? Color.Transparent : button1.BackColor;
        Properties.Settings.Default.btn2 = button1.UseVisualStyleBackColor ? Color.Transparent : button2.BackColor;
        Properties.Settings.Default.btn3 = button1.UseVisualStyleBackColor ? Color.Transparent : button3.BackColor;
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        if (Properties.Settings.Default.btn1 != Color.Transparent) button1.BackColor = Properties.Settings.Default.btn1;
        if (Properties.Settings.Default.btn2 != Color.Transparent) button1.BackColor = Properties.Settings.Default.btn2;
        if (Properties.Settings.Default.btn3 != Color.Transparent) button1.BackColor = Properties.Settings.Default.btn3;
    }

这是 MSDN 上设置类的链接 http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx


属性页

【讨论】:

  • 对于每个用户。除非他正在使用更难更改的应用程序设置。
  • 我有一个愚蠢的问题,什么是项目属性页?我在哪里可以找到它们?
  • 表单序列化不是更容易吗? ..我的意思是未来的发展。
  • @SimonWhitehead - 我认为他只是想保存按钮颜色而不是整个数据!
  • @Tacit - 检查答案末尾的图像!
【解决方案3】:

通常在存储用户界面设置时,标准方法是使用 XML 文件保存或加载设置我做了这个例子,使用 xml 保存用户界面组件希望它有用

https://www.dropbox.com/s/1j1qbe7udqxizr6/4.XMLConfigurationEditor.rar?dl=0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多