Egy*_*ast 7 .net c# entity-framework datagridview winforms
我正在使用C#Windows Form Application使用以下代码使用Entity Framework(EFWinForms)从sql server数据库表填充数据:
MyEntityDataModel db = new MyEntityDataModel();
MyEDS = new EntityDataSource();
MyEDS.DbContext = db;
MyDataGridView.DataSource = MyEDS;
MyDataGridView.DataMember = "MyTable";
Run Code Online (Sandbox Code Playgroud)
它工作正常.用户编辑时,添加数据; 可以使用以下代码保存数据:
MyEDS.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我想要一种通过实体数据源过滤这些数据的方法,以便MyDataGridView保持可编辑状态,用户在过滤数据中完成的任何更新仍然可以保存回数据库.注意:当使用linq to entity过滤数据时,它工作得很好,但它只是填充了用户无法再次编辑或更新的数据快照.
Rez*_*aei 15
当您希望在连接模式下使用Windows窗体中的实体框架时,您应该考虑一些重要的要点.然后,您可以正确保存更改.
使用DbContext的单个实例
使用您的单个实例DataGridView.如果在保存更改时创建新实例,则新实例无法看到您在其他实例上所做的任何更改.所以在表单级别声明它:
TestDBEntities db = new TestDBEntities();
Run Code Online (Sandbox Code Playgroud)
加载数据 - 绑定到实体的本地存储
当您在连接模式与实体合作,利用第一次加载数据DbContext或Load然后绑定你db.Products.Load()来ToList.
它将网格直接绑定到实体集.因此,如果您在绑定源中添加或删除,则更改跟踪器会检测更改并为您添加和删除项目.您可以这样加载数据:
db.Configuration.ProxyCreationEnabled = false;
db.Products.Load();
this.productsBindingSource.DataSource = db.Products.Local.ToBindingList();
Run Code Online (Sandbox Code Playgroud)
使用Linq过滤数据
要过滤数据,请使用linq.您不能使用基础列表的db.Products.ToList()属性; 只有实现该接口的基础列表才支持过滤.例如,您可以通过以下方式过滤数据:BindingSourcedb.Products.Local.ToBindingList()ToBindingList
var filteredData = db.Products.Local.ToBindingList()
.Where(x => x.Name.Contains(this.FilterTextBox.Text));
this.productsBindingSource.DataSource = filteredData.Count() > 0 ?
filteredData : filteredData.ToArray();
Run Code Online (Sandbox Code Playgroud)
删除过滤器
要删除过滤器,只需将绑定源的数据源再次设置为实体的本地存储.这样,当您删除过滤器时,添加和删除将起作用.
this.productsBindingSource.DataSource = db.Products.Local.ToBindingList();
Run Code Online (Sandbox Code Playgroud)
添加/删除/编辑
添加仅适用于未过滤模式.要让用户添加实体,请删除过滤器.你可以使它工作,但它是合理的不要触摸它.
编辑将在过滤或未过滤模式下工作.
删除可以在过滤或未过滤模式下工作.但是如果你使用using System.Data.Entity;你不能依赖它的删除按钮,你应该设置它的DataGridViewno none并处理它的删除项单击事件并编写你自己的代码:
if (productsBindingSource.Current != null)
{
var current = (Product)this.productsBindingSource.Current;
this.productsBindingSource.RemoveCurrent();
if (!string.IsNullOrEmpty(this.FilterTextBox.Text))
db.Products.Local.Remove(current);
}
Run Code Online (Sandbox Code Playgroud)
示例代码:
下面是一个示例代码,其中包含我上面描述的内容.
db.Dispose();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10050 次 |
| 最近记录: |