2009-11-02 86 views
1

我有一个DataGridView的表单,其中DataSource是一个表的BindingSource。这个视图将有一个单行选择和一个按钮来删除,编辑当前选定的行在一个弹出式窗体和一个插入按钮,也将使用相同的窗体。与DatagridView同步WinForm

我的问题是如何同步弹出窗体与当前行?

我尝试使用RowStateChanged事件来获取和存储当前选中的行,在窗体中使用,但我coudnt。事件发生后,我得到之前选择的行。

其他的东西我还不明白在C#中如何拥有一个记录集并且知道哪些是当前记录,即使它是一种新的插入方式,一旦在表单中输入所有数据将显示在相同时间在DataGridView中。

回答

1

您不必将窗体与当前行同步。这就是BindingSource的用途。

当您对BindingSource进行简单绑定时,每次当前项目发生更改时,绑定控件都会更新,并且每当绑定控件中的值发生更改时,绑定项目中的基础值就会更新。当您执行复杂绑定时(即绑定控件显示BindingSource的列表,而不仅仅是当前项目),在BindingSource上更改Position也会更改绑定控件中的当前位置,反之亦然。因此,在这种情况下,您希望使用简单的绑定绑定第二个窗体上的控件,并在第一个窗体上使用复杂绑定绑定第一个窗体上的控件。

您需要做的唯一不寻常的事情是确保两种表格都使用相同的BindingSource。当您这样做时,单击DataGridView中的新行将更新,BindingSource,BindingSource将值从当前绑定项目推送到绑定到它的所有简单绑定控件。

这很容易实现。假设Form1DataGridView形式,并且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") 
} 
+0

你明白了,非常感谢。我做了这件事,它工作正常。我只是不知道如何提交我的更改以及我做的测试,新添加的行只是在表单处理后显示一些值,但是当选择另一行时,值就存在。 – 2009-11-02 06:59:15

+1

大部分情况下,只要'位置'发生变化,即用户移动到另一行时,就会执行更改。您可以通过调用'BindingSource'上的'EndEdit'来显式提交当前行的挂起更改。 (你可以通过调用'CancelEdit'来回滚它们。) 只要添加一个新行,当添加一个新行时,新行中的每一列都会填充其DataColumn中定义的任何DefaultValue '。然后它被添加到列表中,并且任何复杂绑定的控件都会被通知新行存在,并显示它。 – 2009-11-02 08:55:34

1

您可以轻松地保持同步,但不使用BindingSource。

Windows Forms数据绑定建立在几个最重要的接口之上: IList和IBindingList。第一个负责通过列表中的索引提供对元素的访问权限(为了简化),第二个实际上更加复杂。

IBindingList的 - (这是由BindingSource的实现)具有的方法,以支持:

  • 改变通知
  • 增加新的 “空” 的元件
  • 排序
  • 搜索

的一个对你很重要的当然是改变通知。不幸的是BindingSource没有实现那一点代码。你可能会在这里做两件事情 - 要么使用变更通知来实现你的BindingSource版本,要么试图混淆DGV和textboxes/comboboxes事件来更新数据。

我个人做了第一个(我可以分享我的代码)。

“在C#中我还不明白的其他东西如何拥有一个记录集并知道当前记录,即使它的新插入的方式,一旦在窗体中输入所有数据将显示在同时在DataGridView中。“

每个表单都有一个BindingContext对象,用于存放CurrencyManagers - 每个DataSource对应一个。这样,绑定到相同数据源的每个控件都知道哪个记录是当前的。实际上,BindingNavigator所做的是与适当的CurrencyManager进行混合并调用其方法。 (我不知道为什么它需要BindingSource而不是最小IList或IBindingList的全部功能)

+0

韩国社交协会kubal为了答案,但我想我几乎没有什么可以解释的。我是C#的新手,主要与Java一起工作,并且我记得过去曾使用VB记录集,我可以简单地回顾一下数据。 现在看起来像C#使用disconected记录集,并且在DataGridView中所做的更改需要'手动'更新到数据库中。 我正在寻找一个简单的方法来实现这一点,最好只使用RAD界面,但看起来我需要更多地学习,而且我无法看到任何有关它的好的资源来指向最佳实践。将尝试做我的功课,但仍然在寻找一个简单的解决方案。 – 2009-11-02 02:33:12

+0

在某些情况下,您可能想进入'IBindingList'和'BindingContext'和'CurrencyManager'的世界,但保持控件与'DataTable'同步不是其中的一个。 – 2009-11-02 04:25:58