Winforms 绑定到BindingSource时将新行插入DataGridView
我很难让复杂对象数据绑定正常工作。我在表单上有3个DataGridView和1个绑定源。BindingSource.DataSource是FileMoveProcess对象,DataMember是FileMoveProcess对象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 {
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已保存,当我导航到otherFileMoveProcess
并返回时,我不会丢失新的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。这是我早些时候错过的,我会有所帮助的。谢谢你的帖子,你救了我一天!