EF Core查询为空时DataGridView未生成列的技术咨询
问题描述
以下是绑定DataGridView的代码:
Stops_BindingSource = new BindingSource(); dgvStops.DataSource = Stops_BindingSource; Trips_Context.Tripstops.Load(); long Id = (long)dgvTrips.CurrentRow.Cells["Id"].Value; Stops_BindingSource.DataSource = Trips_Context.Tripstops.Local.ToBindingList().Where(x => x.Tripid == Id);
使用上述代码绑定数据后,若EF Core查询返回记录,dgvStops可正常生成列;但查询结果为空时,该DataGridView既不生成列也不显示新增记录行,请问需添加什么处理?
解决方法
核心问题是空结果的Linq查询返回了无类型推断的IEnumerable,DataGridView无法从中获取实体元数据生成列,也无法识别可编辑的列表类型。可以用以下几种方式处理:
方法1:转为强类型BindingList
将过滤后的结果转为指定实体类型的BindingList,确保DataGridView能识别实体结构:// 假设实体类为Tripstop,根据实际类名调整 var filteredStops = Trips_Context.Tripstops.Local.ToBindingList() .Where(x => x.Tripid == Id) .ToList(); Stops_BindingSource.DataSource = new BindingList<Tripstop>(filteredStops);即使结果为空,BindingList也会携带实体的类型信息,DataGridView能据此生成列,同时支持新增行。
方法2:手动预定义DataGridView列
如果列结构固定,可在初始化阶段手动添加对应实体属性的列,关闭自动生成列:// 示例:添加实体对应的列,根据实际属性调整 dgvStops.Columns.Add(new DataGridViewTextBoxColumn { Name = "Id", HeaderText = "ID", DataPropertyName = "Id" }); dgvStops.Columns.Add(new DataGridViewTextBoxColumn { Name = "Tripid", HeaderText = "行程ID", DataPropertyName = "Tripid" }); // 其他属性列同理添加 dgvStops.AutoGenerateColumns = false; Stops_BindingSource.DataSource = Trips_Context.Tripstops.Local.ToBindingList().Where(x => x.Tripid == Id);这种方式不管查询结果是否为空,列都会存在,新增行也能正常显示。
方法3:转为ObservableCollection
利用ObservableCollection的强类型特性,让DataGridView识别结构:Stops_BindingSource.DataSource = Trips_Context.Tripstops.Local .Where(x => x.Tripid == Id) .ToObservableCollection();若项目中没有
ToObservableCollection扩展方法,可自行实现,本质和方法1一致。
内容的提问来源于stack exchange,提问作者T. Morgan
相关产品推荐
相关产品推荐

