首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

自制 DataGridView 摘要行組件:底部固定統計行 (求和/平均/計數) 完整實現

     編輯:關於.NET

組件特性

  • 繼承 DataGridView,設計時屬性配置
  • 底部固定 **SummaryRow** (Panel + 唯讀 TextBox 陣列)
  • 支持任意列聚合:Sum / Average / Count / Min / Max
  • 水平滾動同步、列寬/順序變更自適應

核心架構

ChangeParent():重構父容器

private void changeParent() {
    if (!DesignMode && Parent != null) {
        var panel = new Panel { Dock = DockStyle.Fill, BackColor = BackgroundColor };
        // TableLayoutPanel 特殊處理
        if (Parent is TableLayoutPanel tlp) {
            var pos = tlp.GetCellPosition(this);
            tlp.Controls.Remove(this);
            tlp.Controls.Add(panel, pos.Column, pos.Row);
            tlp.SetRowSpan(panel, tlp.GetRowSpan(this));
            tlp.SetColumnSpan(panel, tlp.GetColumnSpan(this));
        } else {
            Parent.Controls.Remove(this);
            Parent.Controls.Add(panel);
        }
        panel.Controls.Add(this);
        this.Dock = DockStyle.Fill;
        
        // SummaryRow 控件容器
        summaryControl.Dock = DockStyle.Bottom;
        panel.Controls.Add(summaryControl);
        // 同步滾動條等後續調用...
    }
}

SummaryRow 同步機制

  • 監聽 ColumnAdded/Removed/DisplayIndexChanged/WidthChanged
  • reCreateSumBoxes() 重建 TextBox 陣列
  • resizeSumBoxes() 按列寬調整 TextBox 尺寸
  • 水平滾動條置於 SummaryRow 容器頂層,與 Grid 聯動

自定義唯讀 TextBox (繞過灰色背景限制)

protected override void OnPaint(PaintEventArgs e) {
    var bounds = new Rectangle(ClientRectangle.X + 2, ClientRectangle.Y + 2,
                               ClientRectangle.Width - 2, ClientRectangle.Height - 2);
    using (var pen = new Pen(borderColor)) {
        e.Graphics.FillRectangle(new SolidBrush(BackColor), ClientRectangle);
        e.Graphics.DrawRectangle(pen, ClientRectangle.X, ClientRectangle.Y,
                                 ClientRectangle.Width - 1, ClientRectangle.Height - 1);
        e.Graphics.DrawString(Text, Font, Brushes.Black, bounds, format);
    }
}

屬性 IsSummary 標識是否為聚合單元格。

聚合計算邏輯

private void calcSummaries() {
    foreach (string colName in SummaryColumns) {
        decimal sum = 0;
        int count = 0;
        foreach (DataGridViewRow row in Rows) {
            if (row.Cells[colName].Value != null) {
                sum += Convert.ToDecimal(row.Cells[colName].Value);
                count++;
            }
        }
        // 根據 SummaryType 設置對應 TextBox.Text
    }
}

觸發時機:RowsAdded、RowsRemoved、CellValueChanged。

設計時屬性

  • SummaryColumns:需聚合的列名集合
  • SummaryRowBackColor:摘要行背景色
  • SummaryTypes:每列聚合類型 (Sum/Avg/Count...)

測試項目需求

需將 Nwind.mdb 複製到輸出目錄。

源碼來源

原文:CodeProject,出處:zhuqil.cnblogs.com

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved