源代码下载地址: http://d.download.csdn.net/down/1811995/sabty 运行效果 源代码: using System; using System.Data; using System.Collections; using System.Windows.Forms; using System.Drawing; namespace ListViewDemos { /// <summary> /// 标题:ListView 数据绑定、数据汇总及自定义排序示例 /// 作者:X.X.Y /// 日期:2009-08-13 /// 描述:演示 /// 1 如何将数据显示到 ListView。 /// 2 如何对 ListView 中的数据进行求和,并显示到 ListView 上。 /// 3 如何对 ListView 进行自定义排序,并且排序后始终保存合计的行在最下方。 /// /// </summary> public partial class Form1 : Form { #region " Fields " private ListView fListView; private DataTable fProductSales; private ProductSalesSorter fColumnSorter; private String fSummaryRowKey = "合计"; #endregion #region " ProductSales " /// <summary> /// 销售表示例数据 /// </summary> public DataTable ProductSales { get { #region " Init " if (this.fProductSales == null) { this.fProductSales = new DataTable("ProductSales"); // Product 产品 // Price 单价 // Amount 销售数量 // Total 销售金额 this.fProductSales.Columns.Add(new DataColumn("Product", typeof(System.String))); this.fProductSales.Columns.Add(new DataColumn("Price", typeof(System.Decimal))); this.fProductSales.Columns.Add(new DataColumn("Amount", typeof(System.Decimal))); this.fProductSales.Columns.Add(new DataColumn("Total", typeof(System.Decimal), "Price*Amount")); // 添加示例数据 this.fProductSales.Rows.Add(new object[] { "Product1", 8.50, 125 }); this.fProductSales.Rows.Add(new object[] { "Product2", 599.00, 2 }); this.fProductSales.Rows.Add(new object[] { "Product3", 125.36, 6 }); this.fProductSales.Rows.Add(new object[] { "Product4", 580.00, 1 }); this.fProductSales.Rows.Add(new object[] { "Product5", 0.90, 200 }); this.fProductSales.Rows.Add(new object[] { "Product6", 56.17, 36 }); } #endregion return this.fProductSales; } } #endregion #region " Constructor " public Form1() { this.InitListView(); this.fColumnSorter = new ProductSalesSorter(this.fSummaryRowKey); this.fListView.ListViewItemSorter = fColumnSorter; this.Size = new Size(500, 300); this.Text = "ListView 数据绑定、数据汇总及自定义排序示例"; } #endregion #region " InitListView " /// <summary> /// 初始 ListView /// </summary> private void InitListView() { this.fListView = new ListView(); this.fListView.Dock = DockStyle.Fill; this.fListView.View = View.Details; this.fListView.FullRowSelect = true; this.fListView.ColumnClick += new ColumnClickEventHandler(fListView_ColumnClick); this.fListView.Columns.Add("Product"); this.fListView.Columns.Add("Price", 80, HorizontalAlignment.Right); this.fListView.Columns.Add("Amount", 80, HorizontalAlignment.Right); this.fListView.Columns.Add("Total", 80, HorizontalAlignment.Right); // 添加数据行 foreach (DataRow fCurRow in this.ProductSales.Rows) { this.fListView.Items.Add( new ListViewItem(new String[] { fCurRow[0].ToString(), String.Format("{0:F2}",fCurRow[1]), String.Format("{0:F2}",fCurRow[2]), String.Format("{0:F2}",fCurRow[3]) })); } // 添加合计行 this.BuildTotalRow(); this.Controls.Add(this.fListView); } /// <summary> /// 向 ListView 添加一个合计行 /// </summary> private void BuildTotalRow() { Decimal fSumAmount = 0; Decimal fSumTotal = 0; if (this.ProductSales.Rows.Count > 0) { // 分别计算总数据、总金额; // Compute 支持多种函数及计算方式,详细参考 MSDN // http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.expression(VS.80).aspx fSumAmount = (Decimal)this.ProductSales.Compute("SUM(Amount)", ""); fSumTotal = (Decimal)this.ProductSales.Compute("SUM(Total)", ""); } this.fListView.Items.Add(new ListViewItem( new String[] { this.fSummaryRowKey, "", String.Format("{0:F2}", fSumAmount), String.Format("{0:F2}", fSumTotal) })); } #endregion #region " Sort " private void fListView_ColumnClick(object sender, ColumnClickEventArgs e) { if (this.fColumnSorter.SortColumn == e.Column) { this.fColumnSorter.Order = (this.fColumnSorter.Order == SortOrder.Ascending) ? SortOrder.Descending : SortOrder.Ascending; } else { this.fColumnSorter.SortColumn = e.Column; this.fColumnSorter.Order = SortOrder.Ascending; } this.fListView.Sort(); } #endregion } /// <summary> /// 标题:ProductSales 示例表自定义排序类 /// </summary> public class ProductSalesSorter : IComparer { #region " Fields & Properties " private Int32 fSortColumn; private SortOrder fOrder; private CaseInsensitiveComparer fObjectCompare; private String fSummaryRowKey; /// <summary> /// 获取或设置当前需要排序列的索引 /// </summary> public int SortColumn { set { fSortColumn = value; } get { return fSortColumn; } } /// <summary> /// 获取或设置当前的排序方式 /// </summary> public SortOrder Order { set { fOrder = value; } get { return fOrder; } } #endregion #region " Constructor " /// <summary> /// 初始 ProductSalesSorter /// </summary> /// <param name="fSummaryRowKey">合计行第一个单元格的文本</param> public ProductSalesSorter(String fSummaryRowKey) { this.fSortColumn = 0; this.fOrder = SortOrder.None; this.fObjectCompare = new CaseInsensitiveComparer(); this.fSummaryRowKey = fSummaryRowKey; } #endregion #region " Compare " int IComparer.Compare(object x, object y) { ListViewItem fItemX = (ListViewItem)x; ListViewItem fItemY = (ListViewItem)y; // 如果这一行是合计,强制排到最后 if (fItemY.SubItems[0].Text == this.fSummaryRowKey) return -1; Object a, b; if (this.fSortColumn == 0) { a = fItemX.SubItems[fSortColumn].Text; b = fItemY.SubItems[fSortColumn].Text; } else { Decimal j; // ProductSales 表 Price, Amount, Total // 在 ListView 中以文本形式显示, 需要转换成数字后再排序 if (Decimal.TryParse(fItemX.SubItems[fSortColumn].Text, out j)) a = j; else a = 0; if (Decimal.TryParse(fItemY.SubItems[fSortColumn].Text, out j)) b = j; else b = 0; } // 正常逻辑 Int32 fResult = fObjectCompare.Compare(a, b); if (fOrder == SortOrder.Ascending) { return fResult; } else if (fOrder == SortOrder.Descending) { return -fResult; } else { return 0; } } #endregion } }