绑定到 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 -&gt; DataBindings -&gt; 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的主要内容,如果未能解决你的问题,请参考以下文章

WinForm之BindingSource基础操作实例教程

使用BindingSource组件将Windows Forms控件绑定到类型

用BindingSource将Windows窗体控件绑定到DBNull数据库值

DataGridView绑定DataTable的正确姿势

在JavaScript中写入文件时将每个字符串附加到新行[重复]

减少页面宽度时将导航项目阻止到新行中