AdvancedDataGridView排序时固定总计行问题求助
解决AdvancedDataGridView总计行排序失效问题
优先推荐:改用控件自带的Footer行实现总计
AdvancedDataGridView支持显示Footer行,开启后总计行自动固定在底部,不受筛选、排序影响,无需额外处理:- 在设计器或代码中设置
advancedDataGridView1.ShowFooter = true; - 计算各列总计值,直接赋值给Footer行:
// 示例:计算金额列总计 decimal totalAmount = 0; foreach (DataRow row in yourDataTable.Rows) { totalAmount += Convert.ToDecimal(row["Amount"]); } advancedDataGridView1.FooterRow.Cells["ItemName"].Value = "total"; advancedDataGridView1.FooterRow.Cells["Amount"].Value = totalAmount;
- 在设计器或代码中设置
若必须保留DataTable中的总计行:用CustomSort事件实现强制排序
控件默认的SortStringChanged事件会被自身逻辑覆盖,改用CustomSort事件自定义排序规则,确保总计行始终在最后:- 确保控件的
AllowCustomSort属性设为true(设计器或代码中设置) - 绑定CustomSort事件,编写自定义比较逻辑:
private void advancedDataGridView1_CustomSort(object sender, DG.AdvancedDataGridView.CustomSortEventArgs e) { e.Comparer = new Comparison<DataGridViewRow>((row1, row2) => { // 获取Sorting列值,区分普通行(0)和总计行(1) int sortVal1 = Convert.ToInt32(row1.Cells["Sorting"].Value); int sortVal2 = Convert.ToInt32(row2.Cells["Sorting"].Value); if (sortVal1 != sortVal2) { // 总计行始终排在最后 return sortVal1.CompareTo(sortVal2); } else { // 普通行按当前选中列和排序方向处理 var sortCol = e.SortColumn; var dir = e.SortDirection; object val1 = row1.Cells[sortCol.Index].Value; object val2 = row2.Cells[sortCol.Index].Value; if (val1 == DBNull.Value && val2 == DBNull.Value) return 0; if (val1 == DBNull.Value) return dir == ListSortDirection.Ascending ? -1 : 1; if (val2 == DBNull.Value) return dir == ListSortDirection.Ascending ? 1 : -1; int compare = ((IComparable)val1).CompareTo(val2); return dir == ListSortDirection.Descending ? -compare : compare; } }); }
- 确保控件的
内容的提问来源于stack exchange,提问作者Ahmed Saif
相关产品推荐
相关产品推荐

