Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView';绑定的源代码更新?_C#_Winforms_List_Datagridview_Bindingsource - Fatal编程技术网

C# DataGridView';绑定的源代码更新?

C# DataGridView';绑定的源代码更新?,c#,winforms,list,datagridview,bindingsource,C#,Winforms,List,Datagridview,Bindingsource,当我第一次开始从事这个项目时,我从来没有使用过任何.NET,更不用说C#或WinForms了,所以如果我所做的任何事情让你流泪,请让我知道这个设置的最佳实践是什么 我在做一个排程系统。我将事件保存在数据库中,并将这些事件从web服务获取到主列表中,供应用程序使用。此事件类包含活动列表(列表): [全局类] public List Events=Service.GetEvents(); 我有一个显示事件的DataGridView和第二个显示事件活动的DataGridView。我还有一个“保存”按

当我第一次开始从事这个项目时,我从来没有使用过任何.NET,更不用说C#或WinForms了,所以如果我所做的任何事情让你流泪,请让我知道这个设置的最佳实践是什么

我在做一个排程系统。我将事件保存在数据库中,并将这些事件从web服务获取到主列表中,供应用程序使用。此事件类包含活动列表(列表):

[全局类]
public List 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;
[事件视图表单]
BindingSource事件BindingSource=新BindingSource();
BindingSource活动BindingSource=新BindingSource();
列表事件=新列表(Global.events.ToList());
eventsBindingSource.DataSource=事件;
activitiesBindingSource.DataSource=((事件)eventsBindingSource.Current)。腿//在单击新行时更新。
eventsDataGridView.DataSource=eventsBindingSource;
activitiesDataGridView.DataSource=activitiesBindingSource;
我将其设置为,当AvTiveSiesDataGridView上的CellValue更改时,它将检查activitiesBindingSource.Current,在原始的Global.Events列表中查找该事件的活动,如果它不同,它将启用“保存”按钮

但是,当我检查值是否不同时,瞧,Global.Events列表已经更新,即使BindingSource被设置为Events列表,它是该列表的副本

BindingSource有这样的功能吗?如果列表是副本,它也会更新原始列表吗

我不希望它自动更新并保存它的原因是,当用户单击“仅保存”时,我可以更新web服务

我还尝试了以下方法:

  • 使(复制)事件列表成为绑定列表
  • 逐个从全局列表复制事件
  • 绕过BindingSource并将DGV的数据源设置为列表
当我使用Global.Events时,它就可以工作了。事件是一个不同的类,我只用于web服务和应用程序之间的传输(因为实体框架将具有无法通过的集合),但是,由于我已经将该列表更改为包含已转换的事件对象,所以它能够自动更新到目前为止

是否有类似于数据绑定中的UpdateMode,我可以将其设置为不更新,除非我告诉它?还是我只是做错了


感谢您的帮助,如果您需要更多详细信息,请告诉我。

当数据绑定到DataGridView时,DGV不太关心事件存储在什么位置。无论您是使用原始(全局)事件列表,还是手动复制该列表,事实上事件对象始终是相同的,因此,当用户(通过DGV)进行更改时,原始事件会更改

实施这种“节约”模式的一种方法是:

  • 从全局列表克隆原始事件(考虑实现)
  • 设置DGV的数据源以指向这些克隆事件
  • 执行“保存”时,将原始事件与克隆事件匹配(可能通过唯一标识符),并将更改的信息复制到原始事件

  • 我尝试过这样做,但问题依然存在。我想我可能隐藏了一些东西,因为这个表单的代码非常广泛。当所选事件发生变化时,我会重置数据源。我将尝试将其分为控制器和视图,看看是否可以找到问题所在。非常感谢你的建议,不过,我会保留克隆列表作为一个很好的预防措施。
    [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;