C#当有空单元格时按几列降序对数据表进行排序
Posted
技术标签:
【中文标题】C#当有空单元格时按几列降序对数据表进行排序【英文标题】:C# Sort data table descending by a few columns when there is empty cells 【发布时间】:2020-11-29 11:47:57 【问题描述】:我有两个 (int) 列的表:countSelected
和 globalCount
。我想先按countSelected
降序排列表格,然后按globalSelected
降序排列。
我试过了:
DataTable dt = myTable;
if (dt.Rows.Count > 0)
dt = dt.AsEnumerable().OrderByDescending(x => x.Field<int>("countSelected")).ThenByDescending(x => x.Field<int>("GlobalCount"))
.Select(x => x)
.CopyToDataTable();
但它是bad:"System.InvalidCastException"
。也许是因为一些单元格是空的。
我该如何解决这个问题?
【问题讨论】:
您确定数据类型吗?尝试添加“?”在 int 之后。您也可以检查 DBNull.value。 你尝试过像“Int.Parse(x.countSelected)”这样的简单转换吗? 如果您的 DataTable 用作某些控件的 DataSource:myTable.DefaultView.Sort = "countSelected DESC, GlobalCount DESC";
。控件使用 DataTable.DefaultView 作为数据源,因此数据将显示为已排序(而 DataTable 的行顺序保持不变)。如果没有绑定,又想生成一个新的DataTable,那么Sort
和var dt = myTable.DefaultView.ToTable();
。如果您的 DataTable 已绑定,我建议使用 BindingSource 作为 DataSource mediator 对象,并使用其 Sort 方法对数据进行排序。
谢谢!你的回答我成功了!
【参考方案1】:
这两列有不同的大小写样式是否正确?你确定它们是可空的 32 位整数吗?
然后试试这个:
DataTable dt = myTable;
if (dt.Rows.Count > 0)
dt = dt.AsEnumerable()
.OrderByDescending(x => x.Field<int?>("countSelected"))
.ThenByDescending(x => x.Field<int?>("GlobalCount"))
.Select(x => x)
.CopyToDataTable();
【讨论】:
以上是关于C#当有空单元格时按几列降序对数据表进行排序的主要内容,如果未能解决你的问题,请参考以下文章