DataGridView的BindingSource会在多久后更新?

时间:2014-06-06 17:29:50

标签: c# winforms list datagridview bindingsource

当我第一次开始从事这个项目时,我从未使用任何.NET,更不用说C#或WinForms了,所以如果我所做的任何事情都让你流泪,请让我知道是什么最好的做法就是这个设置。

我正在研究一个调度系统。我在数据库中有事件,我从Web服务获取这些事件到应用程序使用的主列表。此Event类包含活动列表(List):

[Global class]

public List<Event> Events = Service.GetEvents();

我有一个显示事件的DataGridView和一个显示事件活动的第二个Datagridview。我还有一个“保存”按钮,只有在事件以任何方式发生变化时才会启用。以下是我的设置方法:

[EventsView form]

BindingSource eventsBindingSource = new BindingSource();
BindingSource activitiesBindingSource = new BindingSource();

List<Event> events = new List<Event>(Global.Events.ToList());

eventsBindingSource.DataSource = events;
activitiesBindingSource.DataSource = ((Event)eventsBindingSource.Current).Legs //updated when clicked on new row.

eventsDataGridView.DataSource = eventsBindingSource;
activitiesDataGridView.DataSource = activitiesBindingSource;

我设置了这样,当avtivitiesDataGridView上的CellValueChanged时,它会检查activitiesBindingSource.Current,在原始的Global.Events列表中查找该事件的活动,如果它不同,它将启用“保存”按钮。

但是,当我检查值是否不同时,请注意,即使BindingSource设置为事件列表(即该列表的副本),Global.Events列表也已更新。

BindingSource是否拥有它,以便如果列表是副本,它也会更新原始文件?

我不希望它自动更新并保存它的原因是我可以在用户单击仅保存时更新Web服务。

我也尝试了以下内容:

  • 让(复制)事件列表成为BindingList
  • 逐个从全局列表中复制事件
  • 绕过BindingSource并将DGV的数据源设置为List

当我将Global.Events作为一个不同的类时,我曾经在Web服务和应用程序之间进行传输(因为实体框架的集合无法通过),但是我已经将该列表更改为已经转换的事件对象,它已经能够自动更新它。

是否有类似于DataBindings中的UpdateMode,我可以将其设置为不更新,除非我告诉它?或者我只是想解决这个问题?

感谢您的帮助,如果您需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

当数据绑定到DataGridView时,DGV并不关心事件存储的内容。无论您是使用原始(全局)事件列表还是手动复制列表,事实上,事件对象始终是相同的,因此,当用户进行更改(通过DGV)时,原始事件会发生变化。

实现这一目标的一种方法&#34; Saving&#34;模型将是:

  1. 从全局列表中克隆原始事件(考虑实施ICloneable)。
  2. 设置DGV的DataSource以指向这些克隆的事件。
  3. 当&#34; Save&#34;执行时,将原始事件与克隆的事件匹配(可能通过唯一标识符),并将更改的信息复制到原始事件。