【问题标题】:How do you refresh a datagridview when using entity framework?使用实体框架时如何刷新数据网格视图?
【发布时间】:2015-06-02 10:44:14
【问题描述】:

我正在使用以下代码将 datagridview 绑定到 SQL Server 数据库

  POSfinalEntities dbe = new POSfinalEntities();      
  BindingSource bs = new BindingSource();   
  dataProducts.DataSource = null;        
  bs.DataSource = dbe.Book.ToList();      
  dataProducts.DataSource = bs;

它工作正常。如果我尝试更新数据库,数据库本身会更新得很好。问题是datagridview。它没有显示更改。我已经尝试了几个小时只是为了让它工作但失败了。

我尝试设置 datasource = null 并再次将其设置为 datasource = bs。 我试过this.datagridview.refresh,不行。

我找不到可行的解决方案。如果这是一个重复的问题,我很抱歉,但我尝试了我可以在这个网站上找到的所有解决方案。如果是重复的。您能否至少提供一个指向有效解决方案的链接。我真的很绝望。谢谢。

更新:这是我用来更新数据库值的代码。我知道,串联是不好的做法,但这不是问题。

private void btneUpdate_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("You are about to save the changes. You won't be able to undo those changes.", "Update fields", MessageBoxButtons.OKCancel) ==   DialogResult.OK)
    {
            eprice = Convert.ToString(numericUpDown3.Value);
            estock = Convert.ToString(numericUpDown4.Value);

            con.Open();

            cmd = new SqlCommand(@"UPDATE Book 
                                      SET BookTitle = '" + txteTitle.Text
                                    + "', BookAuthorLname = '" + txteAuthorLname.Text
                                    + "', BookAuthorFname = '" + txteAuthorFname.Text
                                    + "', BookPrice = '" + Convert.ToDecimal(eprice)
                                    + "', BookDescription = '" + txteDesc.Text
                                    + "', DatePublication = '" + dtpePublished.Value.Date
                                    + "', BookStock = '" + Convert.ToInt32(estock)
                                    + "', isFiction = '" + checkboxbool
                                    + "', GenreID = '" + cmbeCategory.SelectedValue
                                    + "' WHERE ISBN = '" + txteISBN.Text + "';", con);

            cmd.ExecuteNonQuery();
            con.Close();
    }
}

【问题讨论】:

  • 如何更新数据库?你能展示你的代码行吗?
  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入

标签: c# sql-server database winforms


【解决方案1】:

您正在绑定到列表 dbe.Book.ToList()。因此,如果您将项目添加到该列表,您的数据网格只会刷新。您应该将列表保存在变量中并更新该列表。

POSfinalEntities dbe = new POSfinalEntities();      
BindingSource bs = new BindingSource();   
dataProducts.DataSource = null; 
List<Book> books = dbe.Book.ToList();  
bs.DataSource = books;
dataProducts.DataSource = bs;

现在,如果您将一本书添加到列表中,它应该会自动刷新。

Book book = new Book();
books.Add(book);

更简洁的方法是绑定到本地

bs.DataSource = dbe.Book.Local.ToBindingList();

现在,如果您将对象添加到 dbe.Book,您的 DataGridView 将自动更新。

Book book = new Book();
dbe.Book.Add(book);

注意:方法 ToBindingList() 是一个扩展方法。您需要添加命名空间 System.Data.Entity 才能访问此方法。

【讨论】:

  • 除了使用 ToList() 有什么替代方法吗?
  • 用替代方法更新了答案。
  • 每次更新 datagridview 时,POSfinalEntities dbe = new POSfinalEntities(); 都会增加对象实例,从而增加内存使用量。
猜你喜欢
  • 2016-07-06
  • 2017-11-12
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多