我有一个带有DataGridView的Form,DataSource是一个表的BindingSource。此视图将有一行选择和一个要删除的按钮,编辑弹出窗体中当前选定的行以及将使用相同窗体的插入按钮。
我的问题是如何将pop表单与当前行同步?
我尝试使用RowStateChanged事件来获取和存储当前选定的Row,以便在Form中使用但我很好。在事件之后,我得到之前选择的行。
我还不了解C#中的其他东西如何拥有单个记录集并且知道它是当前记录,即使它以一种方式插入一个新的插入方式,所有输入的数据将同时显示在DataGridView中。
答案 0 :(得分:1)
您可以轻松地将其保持同步,但不能使用BindingSource。
Windows Forms数据绑定建立在几个最重要的接口之上: IList和IBindingList。第一个负责通过列表中的索引提供对元素的访问(简化)第二个实际上更复杂。
IBindingList - (由BindingSource实现)具有支持的方法:
对您来说重要的一点当然是更改通知。不幸的是,BindingSource没有实现那一点代码。您可以在此处执行两项操作 - 使用更改通知实现您的BindingSource版本,或尝试使用DGV和文本框/组合框事件来更新数据。
我个人已经完成了第一个(我可以分享我的代码)。
“在C#中我还不明白的另一件事是如何拥有一个记录集并知道它是当前的记录,即使它以一种方式插入一个新的插入方式,所有输入的数据都将显示在同一个记录中DataGridView中的时间。“
每个表单都有一个BindingContext对象,它保存CurrencyManagers - 每个DataSource一个。这样,绑定到同一数据源的每个控件都知道哪个记录是最新的。实际上BindingNavigator所做的是弄乱适当的CurrencyManager并调用它的方法。 (我不知道为什么它需要BindingSource而不是最小IList或完整功能IBindingList)
答案 1 :(得分:1)
您不必将表单与当前行同步。这就是BindingSource
的用途。
当您对BindingSource
进行简单绑定时,每次其当前项更改时,绑定控件都会更新,并且每次绑定控件中的值更改时,绑定项中的基础值都会更新。当您执行复杂绑定时(即绑定控件显示BindingSource
的列表,而不仅仅是当前项),更改Position
上的BindingSource
也会更改绑定中的当前位置控制,反之亦然。因此,在这种情况下,您希望使用简单绑定绑定第二个表单上的控件,并使用复杂绑定绑定第一个表单上的DataGridView
。
您需要做的唯一不寻常的事情是确保两个表单都使用相同的 BindingSource
。当您这样做时,点击DataGridView
中的新行会更新Position
上的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();
}
在Form2中:
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")
}