我有这段代码,我在其中读取了在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
如果我再次点击表格按钮,不保存更改。
知道如何避免这种情况吗?
答案 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();
}
}
}