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

无数据源填充DevExpress DataGrid失败,求解决方法

解决DevExpress DataGrid无法填充的问题

问题分析

你的两种实现方式都存在明显问题,导致网格无法正确显示数据:


1. DataTable方式的错误点

  • 循环内重复创建DataTable,每次循环都会重置数据源,最终仅保留最后一次循环的数据(甚至因Clear()导致无数据)
  • 未提前定义DataTable的列,直接使用row["Name"]会抛出列不存在的异常
  • 创建的DataRow未添加到dt.Rows集合中,等于没有真正插入数据

修正后的DataTable实现

public void FillStatustableau()
{
    var context = new MyContext();
    var users = context.Users.ToList();

    // 初始化DataTable并定义列结构
    DataTable dt = new DataTable();
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Status", typeof(Image));

    foreach (var user in users)
    {
        // 缩放状态图标
        var originalIcon = (Bitmap)(user.IsActive ? Resources.Status_Active : Resources.Status_Inactive);
        var resizedIcon = new Bitmap(16, 16);
        using (var g = Graphics.FromImage(resizedIcon))
        {
            g.DrawImage(originalIcon, new Rectangle(0, 0, 16, 16));
        }

        // 创建行并赋值
        DataRow row = dt.NewRow();
        row["Name"] = user.FullName;
        row["Status"] = resizedIcon;
        dt.Rows.Add(row);
    }

    // 绑定数据源并刷新网格
    gridStatustableau.DataSource = dt;
    gridStatustableau.RefreshDataSource();
}

2. 直接操作GridView方式的错误点

  • 未开启GridView的允许添加行选项,导致AddNewRow()无效
  • 使用GridControl.NewItemRowHandle常量作为行句柄,而非AddNewRow()返回的实际新行句柄
  • 可能未正确配置GridView的列(比如列的FieldName未与赋值的字段匹配)

修正后的GridView直接操作实现(未绑定模式)

public void FillStatustableau()
{
    var context = new MyContext();
    var users = context.Users.ToList();

    // 开启GridView添加行权限
    gvStatustableau.OptionsBehavior.AllowAddRows = true;
    // 设置新行显示位置(可选)
    gvStatustableau.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom;

    foreach (var user in users)
    {
        using (var statusIcon = user.IsActive ? Resources.Status_Active : Resources.Status_Inactive)
        {
            var resizedIcon = new Bitmap(16, 16);
            using (var g = Graphics.FromImage(resizedIcon))
            {
                g.DrawImage(statusIcon, new Rectangle(0, 0, 16, 16));
            }

            // 添加新行并获取行句柄
            int newRowHandle = gvStatustableau.AddNewRow();
            // 为新行赋值(确保列的FieldName为"Name"和"Status")
            gvStatustableau.SetRowCellValue(newRowHandle, "Name", user.FullName);
            gvStatustableau.SetRowCellValue(newRowHandle, "Status", resizedIcon);
            // 提交新行
            gvStatustableau.UpdateCurrentRow();
        }
    }
}

额外注意事项

  • 优先使用绑定数据源的方式(DataTable或自定义实体集合),这是DevExpress Grid的推荐用法,稳定性更高
  • 注意图标资源的释放:如果不需要长期保留图标引用,可使用resizedIcon.Clone()避免资源泄漏
  • 确保GridView的列已正确配置:比如Status列的ColumnEdit设置为PictureEdit,才能正确显示位图

内容的提问来源于stack exchange,提问作者bvsta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:34:52