实体框架:绑定到 DataGridView 的 List<T> 添加回已删除对象以查看

Posted

技术标签:

【中文标题】实体框架:绑定到 DataGridView 的 List<T> 添加回已删除对象以查看【英文标题】:Entity Framework: List<T> Bound to DataGridView add back in deleted object to view 【发布时间】:2013-04-18 16:29:47 【问题描述】:

绑定的数据行被移除后如何恢复(将行添加回DataGridView)?

当我单击 DataGridView 左侧的删除键时,会触发 UserDeletingRow 事件,我可以捕获从列表中删除的实体对象 (AnswerTable)。

private void visitorHostDataGridView_UserDeletingRow (object sender, DataGridViewRowCancelEventArgs e)
  

  if (e.Row.DataBoundItem is VisitorHost)
    
    DatatoDelete datatoDelete = new DatatoDelete (e.Row, e.Row.DataBoundItem as VisitorHost);
    visitorHostsDataRowToDelete.Add (datatoDelete);
    SetModified (); // turns on save and cancel buttons
    

稍后我会在保存时进行删除

public override void OnSave ()


    if (visitorHostsDataRowToDelete.Count > 0)
    
        foreach (DatatoDelete item in visitorHostsDataRowToDelete)
        
            _context.AnswerTables.DeleteObject (item.VisitorHostRecord as VisitorHost);
        
    

    visitorhostBindingSource.EndEdit ();

    _context.SaveChanges ();
    ClearModified (); // turns off save and cancel
    MessageBox.Show ("Saved");

再次,我的问题是如何恢复已删除的行(取消我的删除)并将对象添加回 DataGridView - 在我单击删除之后。 (我不需要确认,我说的是我已经完成了一些工作并意识到我犯了一个错误并想重新开始)我不想回到数据库,我不应该需要我有所有的数据,只是不知道如何使用它。

更新:

我自己试过 List.Add(EntityObject) 没有运气(见下文)。由于cmets再次尝试。按以下顺序用这三件事更新了我的代码:

this.visitorhostBindingSource.DataSource = null;
this.visitorhostBindingSource.DataSource = _hosts;
this.visitorHostsDataGridView.Refresh ();

似乎解决了我遇到的问题,单独添加并没有使其显示在屏幕上。但不知道为什么我需要做我正在做的步骤。任何额外的想法都会很有用。

public override void OnCancel () // called from on click event of cancel button
 

 foreach (DatatoDelete dataGridViewRow in visitorHostsDataRowToDelete)
  
  _hosts.Add (dataGridViewRow.VisitorHostRecord);
  
 visitorHostsDataRowToDelete.Clear();
 _hosts.Sort ();
 this.visitorhostBindingSource.DataSource = null;
 this.visitorhostBindingSource.DataSource = _hosts;
 this.visitorHostsDataGridView.Refresh ();

 ClearModified (); //disable save and cancel buttons
 

【问题讨论】:

【参考方案1】:

在您的事件处理程序方法中使用return 只会退出此方法,而不是整个事件处理程序链。 DataGridView 在你的处理程序被调用之前和之后做了一些事情(你的行从BindingSource 中删除)。

要声明您确实想取消整个活动,您必须使用 e.Cancel = true;

所以要取消在你的处理程序被称为 write 后完成的所有事情:

if(answerTableDataGridView.SelectedRows.Count>1)
    
        // multiselect is false so we should never hit this.
        MessageBox.Show ("only one delete at a time allowed,\n Rows removed from view but NOT DELETED from the database.");
        e.Cancel = true;
        return;
    

CancelEventArgs.Cancel Documentation

【讨论】:

删除了令人困惑的代码,取消删除事件并不是要解决的问题。删除后恢复数据是预期的问题。 如果您不想重新加载整个数据源内容,您应该能够使用 Add 方法将已删除的数据重新添加到绑定源。 Add 本身并没有将项目放回屏幕上,而是用似乎有效的代码更新了问题。【参考方案2】:

如问题所述 我自己试过 List.Add(EntityObject) 没有运气(见下文)。由于cmets再次尝试。按以下顺序用这三样东西更新了我的代码:

this.visitorhostBindingSource.DataSource = null;
this.visitorhostBindingSource.DataSource = _hosts;
this.visitorHostsDataGridView.Refresh ();

似乎解决了我遇到的问题,单独添加并没有使其显示在屏幕上。但不知道为什么我需要做我正在做的步骤。任何额外的想法都会很有用。

public override void OnCancel () // called from on click event of cancel button
 

 foreach (DatatoDelete dataGridViewRow in visitorHostsDataRowToDelete)
  
  _hosts.Add (dataGridViewRow.VisitorHostRecord);
  
 visitorHostsDataRowToDelete.Clear();
 _hosts.Sort ();
 this.visitorhostBindingSource.DataSource = null;
 this.visitorhostBindingSource.DataSource = _hosts;
 this.visitorHostsDataGridView.Refresh ();

 ClearModified (); //disable save and cancel buttons
 

【讨论】:

以上是关于实体框架:绑定到 DataGridView 的 List<T> 添加回已删除对象以查看的主要内容,如果未能解决你的问题,请参考以下文章

c# 中如何把实体类绑定到dataGridView并显示出来。

如何使用 Entity Framework 将多个表中的数据绑定到 datagridview 并使用 CRUD 操作?

C#,Winform绑定实体框架(Entity Framework)的实体,如何去掉或隐藏导航属性?

datagridview绑定List<T>不显示数据

DataGridView绑定数据源

如何实现c# winform DataGridView添加一行,添加数据后,保存到数据库?