Winforms 绑定到BindingSource时将新行插入DataGridView

Winforms 绑定到BindingSource时将新行插入DataGridView,winforms,data-binding,datagridview,objectdatasource,Winforms,Data Binding,Datagridview,Objectdatasource,我很难让复杂对象数据绑定正常工作。我在表单上有3个DataGridView和1个绑定源。BindingSource.DataSource是FileMoveProcess对象,DataMember是FileMoveProcess对象 public class FileMoveProcesses { public List<FileMoveProcess> Processes { get; set; } } public class FileMoveProcess {

我很难让复杂对象数据绑定正常工作。我在表单上有3个DataGridView和1个绑定源。BindingSource.DataSource是FileMoveProcess对象,DataMember是FileMoveProcess对象

public class FileMoveProcesses
{
    public List<FileMoveProcess> Processes { get; set; }
}

public class FileMoveProcess
{
    public string Name { get; set; }
    public bool Disabled { get; set; }
    public FileMoveProcessDetails SourceDetails { get; set; }
    public FileMoveProcessDetails DestinationDetails { get; set; }
}
公共类FileMoveProcess
{
公共列表进程{get;set;}
}
公共类FileMoveProcess
{
公共字符串名称{get;set;}
公共bool已禁用{get;set;}
公共文件MoveProcessDetails SourceDetails{get;set;}
公共文件MoveProcessDetails DestinationDetails{get;set;}
}
还有另外两个DataGridView具有BindingSource的数据源,数据成员分别是SourceDetails和DestinationDetails。如果我已经在xml文件中为这些细节项提供了数据,这就可以了,如下面所示。编辑过程工作得很好,更新按预期序列化

当我尝试添加新的FileMoveProcess时,问题出现了。包含FileMoveProcess的最左侧DataGridView将正确保存,但当我尝试在DataGridView中添加SourceDetails和DestinationDetails数据时,它们无法为新FileMoveProcess创建FileMoveProcessDetails对象,因此无法写入xml文件

我错过了什么

短暂性脑缺血发作


PS组合框是枚举数据绑定,因此数据可用于新项。

我认为您必须自己将新对象添加到绑定源。我创建了一个简单版本的项目,只有2个DGV。我还在我的
dataGridView2->DataBindings->Advanced中将数据源更新模式设置为“从不”

当我编写一个新的
文件moveprocessdetails
(在右侧网格中)时,我可以单击按钮并调用此代码来保存它:

private void button1_Click(object sender, EventArgs e)
{
    var myCurrentRow = dataGridView2.Rows[dataGridView2.CurrentRow.Index];
    var fmpd = myCurrentRow.DataBoundItem;
    var pp = (FileMoveProcess)processesBindingSource.Current;
    pp.SourceDetails = (FileMoveProcessDetails)fmpd;
}

它很生。。。但是BindingSource已保存,当我导航到other
FileMoveProcess
并返回时,我不会丢失新的
FileMoveProcessDetails

我认为您必须自己将新对象添加到BindingSource。我创建了一个简单版本的项目,只有2个DGV。我还在我的
dataGridView2->DataBindings->Advanced中将数据源更新模式设置为“从不”

当我编写一个新的
文件moveprocessdetails
(在右侧网格中)时,我可以单击按钮并调用此代码来保存它:

private void button1_Click(object sender, EventArgs e)
{
    var myCurrentRow = dataGridView2.Rows[dataGridView2.CurrentRow.Index];
    var fmpd = myCurrentRow.DataBoundItem;
    var pp = (FileMoveProcess)processesBindingSource.Current;
    pp.SourceDetails = (FileMoveProcessDetails)fmpd;
}

它很生。。。但是BindingSource被保存了,当我导航到其他
FileMoveProcess
并返回时,我不会丢失新的
FileMoveProcessDetails
它。

我遇到了同样的问题,并且重新认识到,您所要做的就是在默认构造函数中创建List collecion的新实例。:)

公共类FileMoveProcess
{
公共文件移动进程()
{
进程=新列表();
}
公共列表进程{get;set;}
}
公共类FileMoveProcess
{
公共字符串名称{get;set;}
公共bool已禁用{get;set;}
公共文件MoveProcessDetails SourceDetails{get;set;}
公共文件MoveProcessDetails DestinationDetails{get;set;}
}

我遇到了同样的问题,并且意识到您所要做的就是在默认构造函数中创建List collecion的新实例。:)

公共类FileMoveProcess
{
公共文件移动进程()
{
进程=新列表();
}
公共列表进程{get;set;}
}
公共类FileMoveProcess
{
公共字符串名称{get;set;}
公共bool已禁用{get;set;}
公共文件MoveProcessDetails SourceDetails{get;set;}
公共文件MoveProcessDetails DestinationDetails{get;set;}
}

那么,填充详图网格并按“保存”时会发生什么情况?调试时,是否可以看到附加到当前
FileMoveProcess
FileMoveProcessDetails
对象,或者它们是否为空?当源或目标详细信息网格失去焦点时,所有输入的数据都被清除。更新。我进入了详细信息datagrid属性的数据绑定/高级部分,并将绑定下拉列表重置为“无”。这就解决了失去焦点时网格被清除的问题。现在,当我单击“保存详细信息”时,对象为空。FileMoveProcessDetails只能有1个SourceDetails,对吗?(和1 DestinationDetails)那么,当您填充详图网格并按save时会发生什么?调试时,是否可以看到附加到当前
FileMoveProcess
FileMoveProcessDetails
对象,或者它们是否为空?当源或目标详细信息网格失去焦点时,所有输入的数据都被清除。更新。我进入了详细信息datagrid属性的数据绑定/高级部分,并将绑定下拉列表重置为“无”。这就解决了失去焦点时网格被清除的问题。现在,当我单击“保存详细信息”时,对象为空。FileMoveProcessDetails只能有1个SourceDetails,对吗?(和1个DestinationDetails)感谢VLAN。这就成功了。我以为BindingSource会处理这个问题。谢谢VLAN。这就成功了。我假设BindingSource会处理这个问题,我会给你一个+1。这是我早些时候错过的,我会有所帮助的。谢谢你的帖子,你救了我一天!我会给你一个+1。这是我早些时候错过的,我会有所帮助的。谢谢你的帖子,你救了我一天!