C# 删除DataGridView和数据库中的行

C# 删除DataGridView和数据库中的行,c#,entity-framework,C#,Entity Framework,我对数据库和EF是完全陌生的,但我用EF创建了一个数据库,并且在windows窗体上有一个DataGridView控件,该控件是通过将数据源拖到窗体上创建的。用户输入信息并点击保存按钮后,它会使用此代码成功地将其信息保存到数据库中 public partial class bsMainPage : Form { BSDATAContainer db = new BSDATAContainer(); public bsMainPage() { Initial

我对数据库和EF是完全陌生的,但我用EF创建了一个数据库,并且在windows窗体上有一个DataGridView控件,该控件是通过将数据源拖到窗体上创建的。用户输入信息并点击保存按钮后,它会使用此代码成功地将其信息保存到数据库中

public partial class bsMainPage : Form
{
    BSDATAContainer db = new BSDATAContainer();
    public bsMainPage()
    {
        InitializeComponent();
    }

    private void saveBtn_Click(object sender, EventArgs e)
    {
        BSRecords breakfastRecord = new BSRecords();
        breakfastRecord.BS = brkBS.ToString();
        breakfastRecord.Carbs = brkCarb.ToString();
        breakfastRecord.Notes = brkftNoteTxt.Text;
        breakfastRecord.Date = dateTxt.Text;
        BSRecords lunchRecord = new BSRecords();
        lunchRecord.BS = lchBS.ToString();
        lunchRecord.Carbs = lchCarb.ToString();
        lunchRecord.Notes = lnchNoteTxt.Text;
        lunchRecord.Date = dateTxt.Text;
        BSRecords dinnerRecord = new BSRecords();
        dinnerRecord.BS = dnrBS.ToString();
        dinnerRecord.Carbs = dnrCarb.ToString();
        dinnerRecord.Notes = dnnrNoteTxt.Text;
        dinnerRecord.Date = dateTxt.Text;
        db.BSRecords.Add(breakfastRecord);
        db.BSRecords.Add(lunchRecord);
        db.BSRecords.Add(dinnerRecord);
        db.SaveChanges();
   }
}
private void deleteRowsBtn_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow item in this.bSRecordsDataGridView.SelectedRows)
    {
        bSRecordsDataGridView.Rows.RemoveAt(item.Index);
    }
    db.SaveChanges();
}
但在我重新启动程序之前,它不会显示在数据库中。当用户在DataGridView中选择一行并点击包含此代码的delete按钮时

public partial class bsMainPage : Form
{
    BSDATAContainer db = new BSDATAContainer();
    public bsMainPage()
    {
        InitializeComponent();
    }

    private void saveBtn_Click(object sender, EventArgs e)
    {
        BSRecords breakfastRecord = new BSRecords();
        breakfastRecord.BS = brkBS.ToString();
        breakfastRecord.Carbs = brkCarb.ToString();
        breakfastRecord.Notes = brkftNoteTxt.Text;
        breakfastRecord.Date = dateTxt.Text;
        BSRecords lunchRecord = new BSRecords();
        lunchRecord.BS = lchBS.ToString();
        lunchRecord.Carbs = lchCarb.ToString();
        lunchRecord.Notes = lnchNoteTxt.Text;
        lunchRecord.Date = dateTxt.Text;
        BSRecords dinnerRecord = new BSRecords();
        dinnerRecord.BS = dnrBS.ToString();
        dinnerRecord.Carbs = dnrCarb.ToString();
        dinnerRecord.Notes = dnnrNoteTxt.Text;
        dinnerRecord.Date = dateTxt.Text;
        db.BSRecords.Add(breakfastRecord);
        db.BSRecords.Add(lunchRecord);
        db.BSRecords.Add(dinnerRecord);
        db.SaveChanges();
   }
}
private void deleteRowsBtn_Click(object sender, EventArgs e)
{
    foreach (DataGridViewRow item in this.bSRecordsDataGridView.SelectedRows)
    {
        bSRecordsDataGridView.Rows.RemoveAt(item.Index);
    }
    db.SaveChanges();
}

它删除DataGridView中的数据,但不保存数据库中的更改。我已经按照我在这里和其他网站上找到的所有答案在数据库中删除了,但是没有任何东西会保存删除的更改。有人知道如何让它工作吗?

您可以使用“删除”删除它。您需要获取key/id字段,这样就不会看到网格,也不会假设它位于隐藏的第一列中:

private void deleteRowsBtn_Click(object sender, EventArgs e)
{
    string delId;
    BSRecords deleteRecord;
    foreach (DataGridViewRow item in this.bSRecordsDataGridView.SelectedRows)
    {
        bSRecordsDataGridView.Rows.RemoveAt(item.Index);

        // code to remove record from database
        delId = item.Cells[0].Value.ToString();  // column that has id field
        deleteRecord = db.BSRecords.First(b => b.Id == delId);    // get the record. will throw exception if not found.
        db.BSRecords.Remove(deleteRecord);

    }
    db.SaveChanges();
    bSRecordsDataGridView.DataBind();   // this will refresh your grid. Do same in save.
}
另请注意,您可以重写此代码:

BSRecords breakfastRecord = new BSRecords();
breakfastRecord.BS = brkBS.ToString();
breakfastRecord.Carbs = brkCarb.ToString();
breakfastRecord.Notes = brkftNoteTxt.Text;
breakfastRecord.Date = dateTxt.Text;
使用对象初始值设定项:

BSRecords breakfastRecord = new BSRecords { BS = brkBS.ToString(), 
                                            Carbs = brkCarb.ToString(),
                                            Notes = brkftNoteTxt.Text, 
                                            Date = dateTxt.Text };

对于新添加的对象,听起来好像没有重新绑定网格,我不确定语法(部分原因是我将此作为注释)。对于删除,看起来是从数据网格中删除记录,而不是从数据源中删除记录(它们是两个独立的东西)。您还需要在删除后重新绑定数据,否则最终会出现同样的问题。看起来(在撰写本文时)这个问题目前有一个解决删除问题的答案……您可以选择FirstOrDefault或SingleorDefault来获取数据[删除行的相关答案]()谢谢,但我在这里遇到了一个错误b=>b.Id==delId,所以我不得不写b.Id==decimal.Parse(delId)但当我运行它并试图删除一行时,我得到了一个对象引用,它没有设置为对象的实例。此行delId=item.Cells[0]处出错。Value.ToString();我真的很感谢你的帮助!!!那么单元格[0]可能是空的。显示网格标记或将[0]更改为键所在的任何列。