如何解决DataGridView排序报错:必须绑定IBindingList对象
解决DataGridView排序报错:“DataGridView control must be bound to an IBindingList object to be sorted.”
问题原因
你当前绑定的数据源是List<T>(匿名类型的列表),而List<T>未实现IBindingList接口,DataGridView的Sort方法要求数据源必须实现该接口才能触发内置排序逻辑,因此报错。
解决方案
方案1:将List转换为BindingList(推荐)
BindingList<T>实现了IBindingList,直接支持DataGridView的排序功能。修改代码如下:
using (var context = new NorthwindContext()) { var info = (from p in context.Products join od in context.OrderDetails on p.ProductId equals od.ProductId join c in context.Categories on p.CategoryId equals c.CategoryId join o in context.Orders on od.OrderId equals o.OrderId join e in context.Employees on o.EmployeeId equals e.EmployeeId join cu in context.Customers on o.CustomerId equals cu.CustomerId join s in context.Suppliers on p.SupplierId equals s.SupplierId select new { o.OrderId, cu.ContactName, s.CompanyName, e.FirstName, p.ProductName, c.CategoryName, o.OrderDate, o.Freight, }).ToList(); // 将List转换为BindingList dgv.DataSource = new BindingList<dynamic>(info); dgv.Refresh(); }
之后执行dgv.Sort(dgv.Columns["Freight"], ListSortDirection.Ascending);即可正常排序。
方案2:手动排序数据源后重新绑定
如果不想使用BindingList,可以手动对数据源排序,再重新绑定到DataGridView:
// 执行排序时的代码 var currentData = dgv.DataSource as List<dynamic>; if (currentData != null) { // 按Freight升序排序 var sortedData = currentData.OrderBy(item => item.Freight).ToList(); dgv.DataSource = sortedData; dgv.Refresh(); }
这种方法需要自己处理排序逻辑,适合简单场景。
内容的提问来源于stack exchange,提问作者s.o.s
相关产品推荐
相关产品推荐

