You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:05:19