已解决:使用Entity Framework实现点击按钮后刷新Datagridview数据
问题原因
- 你使用的
this.Refresh()、this.Invalidate()仅负责强制控件重绘,不会更新DataGridView绑定的数据源,因此无法展示新增数据 - 你新增数据和查询数据使用了两个独立的EF上下文实例,EF上下文的本地缓存不会自动跨实例同步,且新增完成后你没有重新查询最新数据绑定到控件
ToList()返回的普通集合不支持变更通知,即使集合内容发生变化,DataGridView也无法自动感知刷新
解决方案
方案1:新增后重新绑定数据源(实现最简单,适合数据量不大的场景)
将你现有的数据加载逻辑封装为独立方法,在新增数据保存完成后调用该方法即可:
- 封装数据绑定方法
private void BindDataGrid() { frachtkostenEntities context = new frachtkostenEntities(); var item = from p in context.Artikel select new { Artikelnummer = p.Artikelnummer, Bezeichnung = p.Bezeichnung, }; dgvDisplayDataBase.DataSource = item.ToList(); }
- 新增数据完成后调用绑定方法
var contex = new frachtkostenEntities(); try { var x = new Kunden() { Kundenname = first, Zielort = second, }; contex.Kunden.Add(x); contex.SaveChanges(); // 重新加载最新数据并绑定 BindDataGrid(); }
方案2:使用支持变更通知的绑定集合(性能更优,无需每次全量查询)
使用BindingList作为数据源,该集合实现了变更通知接口,集合内容变更时DataGridView会自动刷新:
- 定义对应数据结构的实体类
public class ArtikelDisplay { public int Artikelnummer { get; set; } public string Bezeichnung { get; set; } }
- 在窗体级别声明绑定集合
private BindingList<ArtikelDisplay> _artikelBindingList;
- 初始化时绑定集合到控件
private void InitDataGrid() { frachtkostenEntities context = new frachtkostenEntities(); var queryResult = from p in context.Artikel select new ArtikelDisplay { Artikelnummer = p.Artikelnummer, Bezeichnung = p.Bezeichnung, }; _artikelBindingList = new BindingList<ArtikelDisplay>(queryResult.ToList()); dgvDisplayDataBase.DataSource = _artikelBindingList; }
- 新增数据后直接往绑定集合添加对应条目即可
var contex = new frachtkostenEntities(); try { var x = new Kunden() { Kundenname = first, Zielort = second, }; contex.Kunden.Add(x); contex.SaveChanges(); // 此处替换为你实际要展示的字段值 _artikelBindingList.Add(new ArtikelDisplay { Artikelnummer = x.Artikelnummer, Bezeichnung = x.Bezeichnung }); }
注意事项
你当前代码中新增的是Kunden表的数据,但DataGridView绑定的是Artikel表的查询结果,如果业务逻辑是要展示客户数据,请将绑定逻辑的查询对象改为context.Kunden,否则新增客户数据不会在控件中展示。
内容的提问来源于stack exchange,提问作者Exi
相关产品推荐
相关产品推荐

