绑定到 BindingSource 时将新行插入 DataGridView
Posted
技术标签:
【中文标题】绑定到 BindingSource 时将新行插入 DataGridView【英文标题】:Inserting New Rows into a DataGridView when bound to a BindingSource 【发布时间】:2014-01-07 17:40:14 【问题描述】:我很难让我的复杂对象数据绑定正常工作。我在一个表单上有 3 个 DataGridViews 和 1 个绑定源。 BindingSource.DataSource 是 FileMoveProcesses 对象,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;
还有 2 个其他 DataGridViews 具有 BindingSource 的 DataSource 和 DataMembers 分别是 SourceDetails 和 DestinationDetails。如果我在这些详细项目的 xml 文件中已有可用数据,则此工作正常,如下所示。编辑过程工作得很好,更新按照您的预期进行序列化。
当我尝试添加新的 FileMoveProcess 时出现问题。包含 FileMoveProcess 的最左侧 DataGridView 将正确保存,但是当我尝试在 datagridview 中添加 SourceDetails 和 DestinationDetails 数据时,它们无法为新的 FileMoveProcess 创建 FileMoveProcessDetails 对象,因此无法写入 xml 文件。
我错过了什么?
TIA
PS ComboBoxes 是 Enum 数据绑定,因此数据可用于新项目。
【问题讨论】:
那么当您填写详细信息网格并按保存时会发生什么?当你调试时,你能看到你的FileMoveProcessDetails
对象附加到当前的 FileMoveProcess
还是为空?
当源或目标详细信息网格失去焦点时,所有输入的数据都会被清除。
更新。我进入详细数据网格属性的 DataBinding/Advanced 部分并将绑定下拉菜单重置为“无”。这解决了失去焦点时网格被清除的问题。现在,当我单击保存时,详细信息对象为空。
FileMoveProcessDetails 只能有 1 个 SourceDetails,对吗? (和 1 个目的地详情)
【参考方案1】:
我遇到了同样的问题,并意识到您所要做的就是在默认构造函数中创建 List 集合的新实例。 :)
public class FileMoveProcesses
public FileMoveProcesses()
Processes = new List<FileMoveProcess>();
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;
【讨论】:
我会为此给你+1。这是我早些时候错过的东西,并且会有所帮助。感谢您的帖子。 你拯救了我的一天!【参考方案2】:我认为您必须自己将新对象添加到 bindingSource。我创建了您项目的一个简单版本,只有 2 个 DGV。我还在dataGridView2 -> DataBindings -> Advanced
中将数据源更新模式设置为“从不”
当我编写一个新的FileMoveProcessDetails
(在右侧网格中)时,我可以单击一个按钮并调用此代码来保存它:
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
。
【讨论】:
感谢 Vland。那成功了。我认为 BindingSource 会解决这个问题。以上是关于绑定到 BindingSource 时将新行插入 DataGridView的主要内容,如果未能解决你的问题,请参考以下文章
使用BindingSource组件将Windows Forms控件绑定到类型
用BindingSource将Windows窗体控件绑定到DBNull数据库值