实体框架:List<绑定到DataGridView,将删除的对象添加回视图

本文关键字:删除 对象 添加 视图 DataGridView 框架 List 绑定 实体 | 更新日期: 2023-09-27 18:09:48

如何恢复绑定数据流(添加行回DataGridView)后,它已被删除?

当我单击DataGridView左侧的delete键时,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)本身没有运气(见下文)。由于评论,再次尝试。按照以下顺序,用这三样东西更新了我的代码:

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
 }

实体框架:List<绑定到DataGridView,将删除的对象添加回视图

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

要声明你真的想取消整个事件,你必须使用 e.Cancel = true;

因此,要取消调用处理程序后所做的所有事情,请写入:

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。取消文档

如上所述我尝试过List.Add(EntityObject)本身,但没有运气(见下文)。由于评论,再次尝试。按照以下顺序,用这三样东西更新了我的代码:

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
 }