Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何在程序运行之间保存/恢复窗体和控件?_Vb.net_Winforms_Visual Studio 2008 - Fatal编程技术网

Vb.net 如何在程序运行之间保存/恢复窗体和控件?

Vb.net 如何在程序运行之间保存/恢复窗体和控件?,vb.net,winforms,visual-studio-2008,Vb.net,Winforms,Visual Studio 2008,我有一个复杂的表单,允许用户配置我的应用程序 保存表单状态并在程序下次运行时重新加载的最佳方法是什么 我的意思是他在列表框中输入的文本,组合/列表/收音机的选定项,复选框是否被选中,等等你有几个选项来保存输入的设置-在配置文件中,或者在注册表中,可能是数据库中(甚至可能是“云”,但我不去那里) Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing ' save all

我有一个复杂的表单,允许用户配置我的应用程序

保存表单状态并在程序下次运行时重新加载的最佳方法是什么


我的意思是他在列表框中输入的文本,组合/列表/收音机的选定项,复选框是否被选中,等等

你有几个选项来保存输入的设置-在配置文件中,或者在注册表中,可能是数据库中(甚至可能是“云”,但我不去那里)

Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing

   ' save all the values you want'

End Sub

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load

   If SaveSettingsExist Then
      ' restore all the values you want'
   End If

End Sub
在保存设置之前,您应该让用户执行特定的操作(例如单击应用按钮)——用户关闭表单时,您不应该只保存设置,因为这最终不是一件好事

如何持久化这些设置完全取决于您-您可以将它们保存到直接的名称/值对样式的配置文件中,您可能希望在配置文件中使用XML,或者将它们保存为注册表中已知位置的键和值(或者您可以将名称/值对保存到数据库表中)

下次运行应用程序时,启动任务之一可以是检查设置的已知位置(无论是注册表还是配置文件),然后将它们加载到设置类中。确保每个设置都有逻辑默认值,以防从未设置,或者由于某些原因无法读回。然后,可以将settings类传递到每个表单,以便应用任何相关的设置,也可以是静态类(全局可见的单实例类),以便可以从应用程序中的任何位置读取


编辑:阅读您对另一个答案的评论后,这里有另一个选项,稍微高级一点。使用我前面提到的设置类,但也使用绑定-您可以将设置对象直接绑定到表单,因此输入的任何值都将直接更新到设置对象中,而无需编写代码(前提是使用双向绑定)。“流”可以通过将设置对象序列化为文件(或数据库)来实现,我建议您查看。

我实际上有两个通用例程,用于保存表单大小/位置和ListView列设置。所以我有点像

Private Sub frm_Closing (sender as Object, e as CancelEventArgs) Handles MyBase.Closing

   SaveFormPos(Me)
   SaveListview(Me, lvuInvoices)

End Sub

Private Sub frm_Load(sender as Object, e as EventArgs) Handles MyBase.Load

   RestoreFormPos(Me)
   RestoreListview(Me, lvuInvoices)

End Sub
Me参数(用于Listview例程)用于为要保存到注册表的值创建一个键。你面前有各种各样的选择。您可以将此功能放入所有表单的基类中,创建一个SaveState类,或者简单地将例程粘贴到模块中。您可以将这些数据保存到注册表、数据库和文本文件中。您可以有一个通用的例程,在控件集合中搜索文本框、复选框等


但是,一旦您创建了一组有用的保存例程,就可以在任何后续表单上使用它们,因此您只需要做一次艰苦的工作。

我也同意在创建表单/关闭应用程序时调用一组函数

作为应用程序设置的存储位置,我建议使用

此外,根据您在表单上使用的控件,您可以选择将其状态保存为XML格式,然后下次还原。 例如,控件提供了这种可能性(例如,具有一对
SaveAsXml/LoadFromXml
函数)。

序列化表单

实现
ISerializable
,并在可序列化构造函数和GetObject()方法中加载/保存字段

onclose中
序列化表单

    /// 
    /// try to obtain the las serialized main form with old data
    MainForm mainForm = DeserializeMainForm("mainForm.data");
    ///
    /// if any old data found, create a new(empty) main form
    if (mainForm == null) mainForm = new MainForm();

    static MainForm DeserializeMainForm(string filePath)
    {
        MainForm mf = null;
        FileStream fileStream = null;
        try
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            fileStream = new FileStream(filePath, FileMode.Open);
            mf = (MainForm)binaryFormatter.Deserialize(fileStream);
        }
        catch { }
        finally
        {
            if (fileStream != null)
            {
                fileStream.Close();
            }
        }

        return mf;
    }
主要表格:

[Serializable]
public partial class MainForm : Form, ISerializable
{
        protected MainForm(SerializationInfo info, StreamingContext context)
        : this()
    {
        if (info == null)
            throw new System.ArgumentNullException("info");

        this.tbxServerIp.Text = info.GetString("server ip");
        this.tbxServerPort.Text = info.GetString("server port");
        this.tbxEventFilter.Text = info.GetString("event filter");
        this.tbxWallId.Text = info.GetString("wallId");

        foreach (Control control in this.Controls)
        {
            if (control is EventSender)
            {
                EventSender eventSender = (control as EventSender);
                eventSender.LoadFromSerializationInfo(info);
            }
        }   
    }

    private void SerializeThis()
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        FileStream fileStream = new FileStream("mainForm.data", FileMode.Create);
        try
        {
            binaryFormatter.Serialize(fileStream, this);
        }
        catch
        {
            throw;
        }
        finally
        {
            fileStream.Close();
        }
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        SerializeThis();
        base.OnClosing(e);
    }
}

这里有很多人告诉我什么时候该存钱,但没有多少人告诉我怎么存钱


最后,我使用了WritePrivateProfileString()

您可以将所有内容以隐藏的形式保存在一个隐藏的
文本框中。
当用户单击
apply
按钮时,自动打开文本文件并让程序逐行读取

例如:

  • 第1行可能是图像的位置
  • 第2行可以是文本框的文本
  • 第3行可以是程序用来确定 复选框为真或假

我假设您使用的是WinForms,但我不必猜测。另外,请不要重复标题中的标签。+1,因为您正试图帮助我。是的。对不起,你不得不猜测,我现在已经使用VB 5个多小时了-总的运行时间-有些事情对我来说还是新鲜事;-)@mawg,你能详细说明一下吗?我把你的问题理解为“我有一个包含各种配置设置的表单,我想在每次打开表单时预先填充到正确的值”。或者您是在问“如何保存任何特定表单的当前状态以备下次使用”?您是希望保存应用程序配置,还是只是一些会话类型的东西?其他回答者对你的问题的理解似乎与我的不同。我如何为下次保存(+1用于要求澄清)啊,手动:-(我希望类似于将表单流式传输到一个文件,然后再返回。这样,如果添加、删除或更改任何控件,我必须编写代码并更改两次。你只是在转移问题。OP现在必须解决如何写入和读取此文本,以及如何写入和读取文件。