DataGridView排序触发InvalidOperationException异常,求解决方案
解决DataGridView排序报错:必须绑定到IBindingList对象
问题根源
报错
System.InvalidOperationException: 'DataGridView控件必须绑定到IBindingList对象才能排序。'的核心原因是:你用的List<GridData>没有实现IBindingList接口,而DataGridView的内置Sort方法依赖这个接口来完成排序操作。
解决方案1:改用BindingList作为数据源
BindingList<T>是.NET内置的实现了IBindingList的集合类,直接替换List就能支持DataGridView的排序:
BindingList<GridData> data = new BindingList<GridData>() { new GridData { name="test1", address="a", id=1, phone=1 }, new GridData { name="test6", address="f", id=3, phone=6 }, new GridData { name="test10", address="c", id=6, phone=8 }, new GridData { name="test8", address="z", id=8, phone=10 }, new GridData { name="test0", address="o", id=10, phone=12 } }; dataGridView1.DataSource = data; dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
如果已经有现成的List,也可以直接转换成BindingList:
List<GridData> originalData = new List<GridData>() { /* 你的现有数据 */ }; BindingList<GridData> bindableData = new BindingList<GridData>(originalData); dataGridView1.DataSource = bindableData; dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
解决方案2:手动排序List后再绑定(一次性排序场景)
如果只是初始化时需要排序,不需要后续通过DataGridView列头动态排序,可以先对List手动排序,再绑定到控件:
List<GridData> data = new List<GridData>() { /* 你的数据 */ }; // 按name字段升序排序,也可以换成其他字段比如id、phone data = data.OrderBy(item => item.name).ToList(); dataGridView1.DataSource = data;
补充说明
如果需要支持列头点击自动排序,BindingList<T>默认已经支持基础排序逻辑;要是需要自定义复杂排序规则,可以继承BindingList<T>并实现相关排序接口,但绝大多数基础场景用默认的BindingList就足够。
内容的提问来源于stack exchange,提问作者Pedro H
相关产品推荐
相关产品推荐

