将数据保存在内存中

本文关键字:内存 存在 保存 数据 | 更新日期: 2023-09-27 18:27:21

我有这样的代码,在其中我读取了在网格视图中反序列化的数据,我们将其命名为FormReadDatabases它的填充方式如下:

xmlData = (xml.ServiceConfig)serializer.Deserialize(reader);
dataGridView1.DataSource = xmlData.Databases;

然后在网格的每一行中,我都有一个按钮"Tables"
单击后,会出现一个新表单FormReadTables

它的填充方式如下:

BindingList<xml.Table> table = new BindingList<xml.Table>();
dataGridView4.DataSource = table;

然后我有一个按钮可以帮助我添加一个新表,它工作正常,新行出现在FormReadTables中,但当我关闭表单时,如果我再次单击"表"按钮,我现在处于FormReadDatabases,则更改不会保存。

知道如何避免这种情况吗?

将数据保存在内存中

这应该很简单,数据绑定需要使用一种即使在打开或关闭表单时也能保持值的机制:

第一种方法可以使用如下静态类型:

static BindingList<xml.Table> table;
public BindingList<xml.Table> FetchTable()
{
if(table == null)
{
 table = new BindingList<xml.Table>();
}
return table
}
dataGridView4.DataSource = FetchTable();

这里有一个问题,如果表单可以有多个实例,而不能访问静态变量,那么在更新表类型时,它需要被锁定/同步

另一种选择是,表类型是主窗体的一部分,它加载子窗体,并在子窗体的构造函数中获取父窗体的实例,该实例被更新并在关闭子窗体后保留。这还需要同步多用户/线程访问

public class ParentForm
{
public BindingList<xml.Table> table = new BindingList<xml.Table>();
}
public class ChildForm
{
ParentForm localPf;
pulic ChildForm(ParentForm pf)
{
localPf = pf;
}
dataGridView4.DataSource = localPf.table;
}

对父窗体对象的表变量的任何更改都不会持续到父窗体在内存中,但请注意,此实现还不是线程安全的

每次打开表单时,都会创建一个新的BindingList。

BindingList<xml.Table> table = new BindingList<xml.Table>();

相反,让另一个页面包含一个变量,当您"新建"另一个表单时,传入该变量。

对打开的表单执行的操作是byref,因此将更新宿主表单变量。这意味着下次打开表单时,传递给它的变量中已经存储了以前的更改。

请求的示例:

我手头没有WinForms环境,但这展示了一些重要的概念。

namespace Bob
{
    public class FormLucy
    {
        private BindingList<xml.Table> table = new BindingList<xml.Table>();
        // your form stuff.. 
        protected void ButtonClick(object sender, EventArgs e)
        {
            var frm = new FormTracy(table);
            // init your forms properties, position etc
            fmr.ShowDialog();
        }
    }
}