无数据源填充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
相关产品推荐
相关产品推荐

