C# 将WinForm与DatagridView同步
我有一个带有DataGridView的表单,它的数据源是表的BindingSource。此视图将有一个单行选择和一个按钮,用于在弹出窗体中删除、编辑当前选定的行,以及一个插入按钮,该按钮也将使用相同的窗体 我的问题是如何将pop表单与当前行同步 我试图使用RowStateChanged事件获取并存储要在表单中使用的当前选定行,但我无法。事件发生后,我得到之前选择的行C# 将WinForm与DatagridView同步,c#,datagridview,sql-server-ce,C#,Datagridview,Sql Server Ce,我有一个带有DataGridView的表单,它的数据源是表的BindingSource。此视图将有一个单行选择和一个按钮,用于在弹出窗体中删除、编辑当前选定的行,以及一个插入按钮,该按钮也将使用相同的窗体 我的问题是如何将pop表单与当前行同步 我试图使用RowStateChanged事件获取并存储要在表单中使用的当前选定行,但我无法。事件发生后,我得到之前选择的行 在C语言中,我还不明白的另一件事是,如何拥有一个记录集,并知道哪个是当前记录,即使它是一个新的记录,以某种方式插入,一旦进入表单,
在C语言中,我还不明白的另一件事是,如何拥有一个记录集,并知道哪个是当前记录,即使它是一个新的记录,以某种方式插入,一旦进入表单,所有输入的数据都将同时显示在DataGridView中。您可以轻松地保持同步,但不必使用BindingSource Windows窗体数据绑定构建在几个界面之上,最重要的是: IList和IBindingList。第一个只是负责通过列表中元素的索引提供对元素的访问(为了简单起见),第二个实际上更复杂 IBindingList-(由BindingSource实现)具有可支持的方法:
- 变更通知
- 添加新的“空”元素
- 分类
- 搜寻
每个表单都有一个BindingContext对象,用于保存CurrencyManager—每个数据源一个。这样,绑定到同一数据源的每个控件都知道哪个记录是当前记录。实际上,BindingNavigator所做的是干扰适当的CurrencyManager并调用其方法。(我不知道为什么它需要BindingSource,而不是在最小的IList中,或者需要完整的功能IBindingList)您不必将表单与当前行同步。这就是
BindingSource
的用途
当您对BindingSource
执行简单绑定时,每次其当前项更改时,绑定控件都会更新,每次绑定控件中的值更改时,绑定项中的基础值都会更新。执行复杂绑定时(即绑定控件显示BindingSource
的列表,而不仅仅是当前项),更改BindingSource
上的位置也将更改绑定控件中的当前位置,反之亦然。因此,在本例中,您希望使用简单绑定绑定第二个表单上的控件,并使用复杂绑定绑定第一个表单上的DataGridView
您需要做的唯一不寻常的事情是确保两个表单使用相同的BindingSource
。执行此操作时,单击DataGridView
中的新行更新BindingSource
上的位置,并且BindingSource
将当前绑定项中的值推送到绑定到它的所有简单绑定控件
这是很容易做到的。假设Form1
是带有DataGridView
的表单,而Form2
是带有简单绑定控件的表单,请执行以下操作:
在表格1中:
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")
}
我想知道答案,但我想我几乎什么都不懂。我是C#新手,主要使用Java,我记得在过去使用VB记录集,在那里我可以简单地来回处理数据。现在看起来C#使用了一个断开的记录集,在DataGridView中所做的更改需要“手动”更新到db中。我正在寻找一个简单的方法来实现这一点,最好只使用RAD接口,但看起来我需要了解更多,我看不到任何关于它的好的来源来指向最佳实践。我将尝试做我的家庭作业,但仍在寻找一个简单的解决方案。在某些情况下,您可能希望进入IBindingList
和BindingContext
和CurrencyManager
的世界,但将控件与DataTable
保持同步不是其中之一。您明白了,非常感谢你。我做了这件事,效果很好。我只是还不知道如何提交我的更改,而且,在我做的测试中,新添加的行在被释放后只显示表单中的一些值,但当选择另一行时,这些值就在那里。在大多数情况下,只要Position
更改,即当用户移动到另一行时,就会提交更改。通过在BindingSource
上调用EndEdit
,可以显式地将挂起的更改提交到当前行。(您可以通过调用CancelEdit
)回滚它们,直到添加新行为止:添加新行时,新行中的每一列都会填充其DataColumn
中定义的任何DefaultValue
。然后它被添加到列表中,任何复杂的绑定控件都会被告知新行存在,并显示新行。