如何正确给DataGridView加载分页列表?加载异常求助
DataGridView加载分页DataRow列表显示异常问题
我尝试给DataGridView加载分页后的DataRow列表,但显示结果异常。不过直接用生成该分页列表的原始DataTable填充DataGridView时,数据能正常显示(无分页)。
以下是我使用的代码:
IPagedList<DataRow> list; public async void PopulateDGV(DataTable myDT) { list = await GetPagedListAsync(myDT); myDGV.DataSource = list.ToList(); // 此处填充后显示异常,但用'myDT'填充则正常 } public async Task<IPagedList<DataRow>> GetPagedListAsync(DataTable dt, int pageNumber = 1, int pageSize = 10) { return await Task.Factory.StartNew(() => { return dt.AsEnumerable().ToPagedList(pageNumber, pageSize); }); }
问题原因
DataGridView无法直接正确解析List<DataRow>的结构——DataRow的列数据并非以公共属性的形式暴露,而DataTable本身带有完整的列元数据,所以直接绑定DataTable能正常识别列并显示数据。
解决方法
方法1:将分页后的DataRow集合转回DataTable
把分页后的DataRow列表重新构建为带列结构的DataTable,完美匹配DataGridView的绑定要求:
public async void PopulateDGV(DataTable myDT) { list = await GetPagedListAsync(myDT); // 克隆原始表的列结构 DataTable pagedDT = myDT.Clone(); // 将分页后的DataRow导入新表 foreach (var row in list) { pagedDT.ImportRow(row); } myDGV.DataSource = pagedDT; }
方法2:直接绑定IPagedList实例(若库支持)
如果使用的是X.PagedList这类成熟的分页库,尝试直接绑定IPagedList实例而非转成List<DataRow>,部分库的IPagedList实现做了绑定适配:
public async void PopulateDGV(DataTable myDT) { list = await GetPagedListAsync(myDT); myDGV.DataSource = list; // 替换list.ToList() }
方法3:用BindingSource做中间层包装
通过BindingSource作为数据绑定的中间层,帮助DataGridView识别数据结构:
public async void PopulateDGV(DataTable myDT) { list = await GetPagedListAsync(myDT); BindingSource bindingSource = new BindingSource(); bindingSource.DataSource = list.ToList(); // 关联原始表的列信息 bindingSource.DataMember = myDT.TableName; myDGV.DataSource = bindingSource; }
内容的提问来源于stack exchange,提问作者Mykhil
相关产品推荐
相关产品推荐

