将数据保存在内存中

时间:2014-10-22 09:18:01

标签: c# winforms

我有这段代码,我在其中读取了在gridview中反序列化的数据,我们将其命名为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如果我再次点击表格按钮,不保存更改。

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

2 个答案:

答案 0 :(得分:2)

这应该很简单,即使打开或关闭表单,也需要使用可以保存值的机制来进行数据绑定:

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

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;
}

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

答案 1 :(得分:1)

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

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

相反,让另一个页面包含一个变量,当你新的&#39;另一种形式,传入变量。

对打开的表单采取的操作是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();
        }
    }
}