0

删除绑定数据行后如何恢复绑定数据行(将行添加回 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) 没有运气(见下文)。由于评论再次尝试。按以下顺序用这三件事更新了我的代码:

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
 }
4

2 回答 2

0

如问题所述,我自己尝试了 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
 }
于 2013-07-23T14:44:26.147 回答
0

在您的事件处理程序方法中使用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.Cancel 文档

于 2013-04-19T08:47:22.427 回答