您不必将窗体与当前行同步。这就是BindingSource
的用途。
当您对BindingSource
进行简单绑定时,每次当前项目发生更改时,绑定控件都会更新,并且每当绑定控件中的值发生更改时,绑定项目中的基础值就会更新。当您执行复杂绑定时(即绑定控件显示BindingSource
的列表,而不仅仅是当前项目),在BindingSource
上更改Position
也会更改绑定控件中的当前位置,反之亦然。因此,在这种情况下,您希望使用简单的绑定绑定第二个窗体上的控件,并在第一个窗体上使用复杂绑定绑定第一个窗体上的控件。
您需要做的唯一不寻常的事情是确保两种表格都使用相同的BindingSource
。当您这样做时,单击DataGridView
中的新行将更新,BindingSource
,BindingSource
将值从当前绑定项目推送到绑定到它的所有简单绑定控件。
这很容易实现。假设Form1
与DataGridView
形式,并且Form2
是一个与简单地绑定控件,这样做:
在Form1:
private BindingSource Source = new BindingSource();
Form1_Load(object sender, EventArgs e)
{
// set Source's DataSource to your DataTable here.
mainDataGridView.DataSource = source;
// create DataGridView columns and their bindings here.
Form2 f2 = new Form2();
f2.TopMost = true;
f2.Source = Source;
f2.Show();
}
在窗体2:
public BindingSource Source { get; set; }
public void Form2_Load(object sender, EventArgs e)
{
idTextBox.DataBindings.Add("Text", Source, "id");
descriptionTextBox.DataBindings.Add("Text", Source, "description")
}
你明白了,非常感谢。我做了这件事,它工作正常。我只是不知道如何提交我的更改以及我做的测试,新添加的行只是在表单处理后显示一些值,但是当选择另一行时,值就存在。 – 2009-11-02 06:59:15
大部分情况下,只要'位置'发生变化,即用户移动到另一行时,就会执行更改。您可以通过调用'BindingSource'上的'EndEdit'来显式提交当前行的挂起更改。 (你可以通过调用'CancelEdit'来回滚它们。) 只要添加一个新行,当添加一个新行时,新行中的每一列都会填充其DataColumn中定义的任何DefaultValue '。然后它被添加到列表中,并且任何复杂绑定的控件都会被通知新行存在,并显示它。 – 2009-11-02 08:55:34