如何从透视数据表或DataTable所有列中获取最大值
解决DataTable透视表取所有数值最大值的方案
方案1:直接遍历数据源DataTable(推荐,避免UI控件依赖)
跳过GridView,直接操作生成透视表的DataTable,逻辑更直观且避免控件绑定带来的额外问题:
int maxValue = 0; // 遍历DataTable的每一行 foreach (DataRow row in yourDataTable.Rows) { // 遍历当前行的所有列 foreach (DataColumn col in yourDataTable.Columns) { // 跳过非数值列(比如存储星期名称的列,根据你的表结构调整判断条件) if (col.ColumnName.Equals("星期", StringComparison.OrdinalIgnoreCase)) continue; // 安全转换为整数,处理DBNull或空值情况 if (int.TryParse(row[col].ToString(), out int currentValue)) { if (currentValue > maxValue) maxValue = currentValue; } } } // maxValue即为所有时段事件数的最大值
方案2:修复嵌套List的取值逻辑
如果坚持用GridView遍历生成嵌套List,只需修正最大值的获取方式(不能直接将嵌套列表转为整数,需扁平化遍历):
List<List<int>> dataList = new List<List<int>>(); // 先完成GridView到嵌套List的转换(修正转换逻辑,处理空值) foreach (GridViewRow row in GridView1.Rows) { List<int> rowList = new List<int>(); // 从第2列开始遍历(跳过第1列的星期名称) for (int i = 1; i < row.Cells.Count; i++) { if (int.TryParse(row.Cells[i].Text.Trim(), out int val)) rowList.Add(val); } dataList.Add(rowList); } // 正确获取嵌套List的最大值 // 方式1:逐个遍历子列表找最大值 int maxValue = 0; foreach (var subList in dataList) { int subMax = subList.Max(); if (subMax > maxValue) maxValue = subMax; } // 方式2:用LINQ扁平化列表后取最大值(需引用System.Linq) // int maxValue = dataList.SelectMany(sublist => sublist).Max();
方案3:用LINQ直接查询DataTable(简洁写法)
借助LINQ和DataTable扩展方法,一行代码搞定:
// 需引用System.Linq和System.Data.DataSetExtensions int maxValue = yourDataTable.AsEnumerable() .SelectMany(row => yourDataTable.Columns .Cast<DataColumn>() .Where(col => !col.ColumnName.Equals("星期", StringComparison.OrdinalIgnoreCase)) .Select(col => row.Field<int?>(col)) // 用可空整数处理DBNull .Where(val => val.HasValue) .Select(val => val.Value)) .Max();
注意事项
- 必须处理DBNull或空字符串的情况,否则转换整数时会抛出异常
- 如果透视表的列命名不同,需调整排除非数值列的判断逻辑
- 优先操作DataTable数据源,而非GridView控件,避免UI状态影响数据准确性
内容的提问来源于stack exchange,提问作者epaezr
相关产品推荐
相关产品推荐

