在C# WinForm中通过过滤旧UltraGrid单元格创建新UltraGrid
基于UltraGrid过滤条件创建新网格的解决方案
核心思路
UltraGrid的展示依赖绑定的数据源(如DataTable、泛型集合),直接操作数据源进行过滤后再绑定新网格,比遍历网格单元格的嵌套循环更高效且不易出错,能避免网格显示逻辑(如虚拟化、分组)带来的偏差。
具体实现(以DataTable数据源为例)
- 提取原网格的数据源,复制表结构以保留列定义
- 筛选出C列有值的行,导入到新的数据源中
- 将过滤后的数据源绑定到新UltraGrid
// 获取原网格XYZ的数据源(假设绑定的是DataTable) DataTable originalTable = ultraGridXYZ.DataSource as DataTable; if (originalTable == null) return; // 复制原表结构,创建空的过滤表 DataTable filteredTable = originalTable.Clone(); // 遍历原表行,筛选C列非空的行 foreach (DataRow row in originalTable.Rows) { // 根据C列实际数据类型调整判断逻辑,这里处理字符串/空值场景 if (!row.IsNull("C") && !string.IsNullOrEmpty(row["C"].ToString().Trim())) { filteredTable.ImportRow(row); } } // 绑定到新UltraGrid ultraGridNew.DataSource = filteredTable;
泛型集合数据源的处理(LINQ方式)
如果原网格绑定的是自定义实体集合,用LINQ过滤更简洁:
List<YourEntityModel> originalList = ultraGridXYZ.DataSource as List<YourEntityModel>; if (originalList == null) return; // 筛选C属性非空的实体 var filteredList = originalList.Where(model => !string.IsNullOrEmpty(model.C?.Trim())).ToList(); // 绑定新网格 ultraGridNew.DataSource = filteredList;
注意事项
- 需根据C列实际数据类型调整判断逻辑:比如数值类型需判断是否为非默认值(如
model.C != 0),日期类型判断是否为有效日期 - 不要直接遍历UltraGrid的
Rows和Cells,网格的显示行可能因分页、分组等和实际数据源不一致,操作数据源是更可靠的方式
内容的提问来源于stack exchange,提问作者sinha
相关产品推荐
相关产品推荐

